在我的表单中,我有一个带有TableModelListener的JTable。 tableChanged方法更新了我的JButtons上的逻辑。一切正常。当用户在jtable中的单元格中编辑值时 - 执行tableChanged方法并相应地刷新按钮。
我遇到的问题,这是一个显示阻止。 JTable显示对象和对象的一些属性。用户从应用程序中选择对象 如果我选择了一个对象并在jtable中显示。如果该用户更改了应用程序中的属性值而未在JTable中编辑它。 jtable仍然会刷新,并显示更改的值。但是没有发生TableModelEvent,我的按钮逻辑永远不会刷新。
我看过TableCellListeners - 但是仍在寻找表中的编辑。所以我认为这不会起作用。
如果没有在jtable本身发生事件,我该如何判断某些内容已发生变化且表格已更新?
编辑:放置一些jtable代码
这是我的基础对话框
selectTable = new JTable(SingletonSelectTable.getInstance());
selectTable.getModel().addTableModelListener(this);
selectTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Font font = comp.getFont();
if (SingletonSelectTable.getInstance().isCellBold(row, column) == true){
comp.setFont(font.deriveFont(Font.BOLD));
}
return comp;
}
});
selectTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
selectTable.setCellSelectionEnabled(false);
selectTable.setRowSelectionAllowed(true);
selectTable.setColumnSelectionAllowed(false);
JScrollPane ScrollPane = new JScrollPane(selectTable);
tableChanged方法
public void tableChanged(TableModelEvent e) {
setRemoveButtonVisibility();
setRemoveAllButtonVisibility();
setCommentButtonVisibility();
setOKButtonEnabledStatus();
}
我的单身课
public class SingletonSelectTable extends AbstractTableModel {
我希望这会有所帮助
答案 0 :(得分:3)
如果没有在jtable本身发生事件,我该如何判断某些内容已发生变化且表格已更新?
JTable
中从未发生过任何事件。它是基础TableModel
的变化,而TableModel
则会触发事件。
JTable
向TableModel
注册一个监听器,因此它知道何时应该更新显示的表内容。
所以如果你说JTable
得到更新(自动,所以没有你滚动/选择/悬停/ ...)意味着TableModel
会触发一个事件,这意味着你也可以听听它。
在该方案中,您的应用中更改了TableModel
的元素,应该从TableModelEvent
触发TableModel
。通常,这可以通过让TableModel
侦听其包含的对象中的更改来完成,或者让更改对象的代码也通知TableModel
基础数据已更改。无论哪种方式,TableModel
都需要触发一个事件,所以没有理由为什么你的监听器不会接收它,除非它没有被触发(意味着TableModel
}。
根据您的评论,我最好的猜测是,您TableModel
的实施方式不正确,TableModel
根本没有触发事件,JTable
获取“偶然”更新(根据我的经验,JTable
对于丢失的事件非常健壮,当然没有添加/删除行时...与JTree
相比,确定
getValueAt()方法获取更改,然后更新jtable
这听起来真的不对。 getValueAt()
方法通常在JTable
收到事件后调用。由于该事件,JTable
知道必须更新它,因此它会在模型中查询新数据。因此getValueAt
方法不会获取更改,但会因更改而被调用。
我强烈建议您查看Swing table tutorial,当然还有关于Creating a table model,Listening for data changes和Firing data change events
的部分