2013-08-28 55 views
0
import groovy.beans.Bindable; 
import groovy.swing.SwingBuilder 
import java.awt.BorderLayout 
import javax.swing.JFrame 

@Bindable def people = [[name:"Mary", age:18], 
      [name:"Tom", age:25]] 

def swingBuilder = new SwingBuilder() 
swingBuilder.edt { // edt method makes sure UI is build on Event Dispatch Thread. 
    lookAndFeel 'system' // Simple change in look and feel. 
    frame( title: 'Display a table', 
      size: [400,300], 
      show: true, 
      locationRelativeTo: null, 
      defaultCloseOperation: JFrame.EXIT_ON_CLOSE) 
     { 
      menuBar() { 
       menu(text: "File", mnemonic: 'F'){ 
        menuItem(text: "Add", 
        actionPerformed: { 
         people << [name:"Harry", age:17] 
         println people 
        } 
       )} 
      } 
      panel(layout: new BorderLayout()) { 
       scrollPane(constraints: BorderLayout.CENTER) { 
        table() { 
         def listTeacher 
         tableModel(list: people) { 
          propertyColumn(header: 'Name', propertyName: 'name') 
          propertyColumn(header: 'Age', propertyName: 'age') 
         } 
        } 
       } 
      } 
     } 
} 

单击“添加”时,将一个条目添加到列表people,但JTable未更新。我该如何解决它?当其内容更改时,JTable不更新

回答

3

你可以把它的ObservableList,他们再刷新表模型时以某种方式列表的变化:

import groovy.beans.Bindable; 
import groovy.swing.SwingBuilder 
import java.awt.BorderLayout 
import javax.swing.JFrame 
import java.beans.PropertyChangeListener 

@Bindable ObservableList people = [ [name:"Mary", age:18], 
            [name:"Tom", age:25] ] 

def swingBuilder = new SwingBuilder() 
swingBuilder.edt { // edt method makes sure UI is build on Event Dispatch Thread. 
    lookAndFeel 'system' // Simple change in look and feel. 
    frame( title: 'Display a table', 
      size: [400,300], 
      show: true, 
      locationRelativeTo: null, 
      defaultCloseOperation: JFrame.HIDE_ON_CLOSE) { 
     menuBar() { 
      menu(text: "File", mnemonic: 'F'){ 
       menuItem(text: "Add", actionPerformed: { 
        people << [name:"Harry", age:17] 
        println people 
       } 
      ) } 
     } 
     panel(layout: new BorderLayout()) { 
      scrollPane(constraints: BorderLayout.CENTER) { 
       table { 
        def listTeacher 
        tableModel(id:'model', list: people) { m -> 
         propertyColumn(header: 'Name', propertyName: 'name') 
         propertyColumn(header: 'Age', propertyName: 'age') 
        } 
       } 
      } 
      people.addPropertyChangeListener({ e -> model.fireTableDataChanged() } as PropertyChangeListener) 
     } 
    } 
} 
+0

谢谢,我找到了解决办法,但你的解决方案是更优雅。 –