绑定数据触发更改后,Swing / JTable不会更新

时间:2010-09-08 18:57:24

标签: java events swing jtable

我有一个绑定到我的EventTracker bean的JTable,它实际上是一个列表的包装器,我将仅用作append / clear(即一个简单的日志)。问题是,当我向列表添加条目并尝试触发事件时,我看不到任何更改。我正在使用NetBeans IDE。

EventTracker bean被添加到视图中并实例化为eventTracker1。从那里,我右键单击表格并选择“表格内容...”。表模型绑定到eventTracker1,绑定表达式为'$ {eventList}'。这些列已正确设置以对eventList中的条目进行操作。

// From inside EventTracker.java
public static final String EVENT_LIST_PROPERTY = "eventList"; 
public List getEventList() {
    System.out.println("Handing out eventList with size: " + Integer.toString(eventList.size()));
    return eventList;
}

public void setEventList(List incomingList) {
    List oldList = eventList;
    eventList = new ArrayList(incomingList);
    propertySupport.firePropertyChange(EVENT_LIST_PROPERTY, oldList, eventList);
}

当我的外部代码在setEventList上运行时,方法firePropertyChange似乎符合specSo,它似乎触发了事件,因为然后调用了getEventList并且列表大小按预期上升。只是桌子没有渲染。我能做些什么才能做到这一点?

4 个答案:

答案 0 :(得分:2)

假设您的数据模型派生自AbstractTableModel,您可以显式更新模型并触发抽象父级中实现的相应更新方法。此外,更新必须在EDT上进行,通常使用invokeLater()。另请参阅Listening for Data ChangesFiring Data Change Events

EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
        // update model, which should fire the appropriate event
    }
});

答案 1 :(得分:1)

我真的很想让数据绑定工作。建议的答案是好读,但会让我写出很多代码。我不想处理行计数/列计数逻辑和所有额外的工作。因此,此解决方案可能提供较少的控制,但这种只读工作流程非常快速和简单。

http://swinglabs.org/docs/presentations/2007/DesktopMatters/beans-binding-talk.pdf的文件让我很瘦。诀窍是使用ObservableCollection / ObservableList(new ArrayList<Event>)作为数据存储区。每当我添加另一个条目时,它都会自动反映在JTable

大!

答案 2 :(得分:0)

您需要告诉表格数据模型已更改:

.fireTableDataChanged()

是正确的方法;假设您的表格来自抽象表模型。

(是的,我同意trashgod)

答案 3 :(得分:0)

目前尚不清楚如何将EventTracker类绑定到表中。我假设您正在使用相应的编辑器和渲染器类,然后设置渲染和编辑器,如table.setDefaultRenderer(EventTracker.class,new EventTrackerRender());和{{1}仅当您需要通过表更改EventTracker bean时才使用.Editor。

如果从表外部(即通过代码)完成,则覆盖Table模型中的setValueAt函数,然后使用getValueAt获取EventTracker对象(这是当前对象)并进行必要的更改(如果Eventtracker是可变对象) 。在不可变对象的情况下,创建一个EventTracker的新对象并将其设置为对象数组。之后,您应该调用table.setDefaultEditor(EventTracker.class,new EventTrackerEditor());来重绘整个表,或者为特定单元调用fireTableDataChanged()再次渲染。