Java 刷新JTable时执行的tableChange()
在我的表单中,我有一个带有TableModelListener的JTable。tableChanged方法更新我的JButtons上的逻辑。这一切都正常工作。当用户编辑jtable中某个单元格中的值时,会执行tableChanged方法并相应地刷新按钮 我遇到的问题是,这是一个表演的阻碍。JTable显示对象和对象的某些属性。用户从应用程序中选择对象。Java 刷新JTable时执行的tableChange(),java,swing,jtable,Java,Swing,Jtable,在我的表单中,我有一个带有TableModelListener的JTable。tableChanged方法更新我的JButtons上的逻辑。这一切都正常工作。当用户编辑jtable中某个单元格中的值时,会执行tableChanged方法并相应地刷新按钮 我遇到的问题是,这是一个表演的阻碍。JTable显示对象和对象的某些属性。用户从应用程序中选择对象。 如果我选择了一个对象并显示在jtable中。如果该用户更改了应用程序中的属性值,而没有在JTable中编辑它。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);
表格改变了方法
public void tableChanged(TableModelEvent e) {
setRemoveButtonVisibility();
setRemoveAllButtonVisibility();
setCommentButtonVisibility();
setOKButtonEnabledStatus();
}
我的单身班
public class SingletonSelectTable extends AbstractTableModel {
我希望这有帮助
在jtable本身没有发生事件的情况下,如何判断某些内容已更改,并且表已更新
JTable
中从来没有事件。更改的是底层的TableModel
,触发事件的是TableModel
。
JTable
向TableModel
注册一个侦听器,以便它知道何时应该更新显示的表内容
因此,如果您说JTable
得到更新(自动更新,因此无需滚动/选择/悬停/…),则意味着TableModel
确实触发了一个事件,这意味着您也可以监听它
在该场景中,应用程序中的TableModel
元素发生了更改,应该有人从TableModel
触发TableModel事件。通常,这是通过让TableModel
侦听它所包含的对象中的更改来完成的,或者让更改对象的代码也通知TableModel
底层数据已更改。无论哪种方式,TableModel
都需要触发一个事件,因此您的侦听器没有理由不接收它,除非它没有被触发(意味着不正确的TableModel
)
根据您的评论,我最好的猜测是您的TableModel
实现不正确,并且您的TableModel
根本没有触发事件,并且JTable
被“意外”更新(根据我的经验,JTable
对于缺少的事件非常健壮,当然是在没有添加/删除行的情况下……与JTree
相比,这是非常明确的)
getValueAt()方法获取更改,然后更新jtable
这听起来确实不正确
方法通常在收到事件后由JTable
调用。由于该事件,JTable
知道它必须更新,因此它会查询模型中的新数据。因此getValueAt
方法不会拾取更改,而是作为更改的结果被调用
我强烈建议大家看一下,当然还有关于,和的章节
在jtable本身没有发生事件的情况下,如何判断某些内容已更改,并且表已更新
JTable
中从来没有事件。更改的是底层的TableModel
,触发事件的是TableModel
。
JTable
向TableModel
注册一个侦听器,以便它知道何时应该更新显示的表内容
因此,如果您说JTable
得到更新(自动更新,因此无需滚动/选择/悬停/…),则意味着TableModel
确实触发了一个事件,这意味着您也可以监听它
在应用程序中更改了TableModel
的一个元素的情况下,应该从TableModel
中触发TableModel事件
。通常通过让TableModel
侦听它所包含的对象中的更改,或者让更改对象的代码也执行此操作通知TableModel
基础数据已更改。无论哪种方式,TableModel
都需要触发一个事件,因此您的侦听器没有理由不接收它,除非它没有被触发(意味着不正确的TableModel
)
根据您的评论,我最好的猜测是您的TableModel
实现不正确,并且您的TableModel
根本没有触发事件,并且JTable
被“意外”更新(根据我的经验,JTable
对于缺少的事件非常健壮,当然是在没有添加/删除行的情况下……与JTree
相比,这是非常明确的)
getValueAt()方法获取更改,然后更新jtable
这听起来确实不正确方法通常在收到事件后由JTable
调用。由于该事件,JTable
知道它必须更新,因此它会查询模型中的新数据。因此getValueAt
方法不会拾取更改,而是作为更改的结果被调用
我强烈建议大家看一看,当然还有关于和在不改变TableModel的情况下JTable单元格是如何变化的?不知道…,为了更好地帮助您尽早发布SSCCET,getValueAt()方法会获取变化,然后更新jtabl