JTable内容更改时不会更新

时间:2013-08-28 04:40:32

标签: groovy

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。我该如何解决?

1 个答案:

答案 0 :(得分: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 )
        }
    } 
}