在我的表单中,我有一个带有TableModelListener的JTable。 tableChanged方法更新了我的JButton的逻辑。这一切都正常工作。当用户在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 {
我希望这有帮助
最佳答案
我怎么能知道在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的部分
关于java - 刷新JTable时执行tableChange(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11547241/