我有一个绑定到我的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并且列表大小按预期上升。只是桌子没有渲染。我能做些什么才能做到这一点?
答案 0 :(得分:2)
假设您的数据模型派生自AbstractTableModel
,您可以显式更新模型并触发抽象父级中实现的相应更新方法。此外,更新必须在EDT上进行,通常使用invokeLater()
。另请参阅Listening for Data Changes和Firing 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()
再次渲染。