gpt4 book ai didi

java - 刷新 JTable 时执行 tableChange()

转载 作者:行者123 更新时间:2023-12-02 00:18:09 25 4
gpt4 key购买 nike

在我的表单中,我有一个带有 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 {

希望这有帮助

最佳答案

How can I tell that something has changed and the Table has been updated without a Event taking place in the jtable itself?

JTable 中从来没有任何事件。它是底层TableModel变化了,那就是 TableModel触发一个事件。JTableTableModel注册一个监听器所以它知道何时应该更新显示的表格内容。

因此,如果您是说 JTable更新(自动,因此无需您滚动/选择/悬停/...)意味着 TableModel确实会触发一个事件,这意味着您也可以监听它。

在该场景中,您的 TableModel 的一个元素如果您的应用程序发生更改,则应该触发 TableModelEvent来自TableModel 。通常,这是通过让 TableModel 来完成的。监听其包含的对象的更改,或者让更改对象的代码也通知 TableModel基础数据已更改。无论哪种方式,TableModel需要触发一个事件,因此您的监听器没有理由不接收它,除非它根本没有被触发(意味着不正确的 TableModel )。

根据您的评论,我最好的猜测是您的 TableModel 的实现不正确。那你的TableModel根本不触发事件,并且 JTable “意外”更新(根据我的经验, JTable 对于丢失事件相当强大,当然是在没有添加/删除行的情况下......与 JTree 相比绝对如此)

The getValueAt() method picks up the change and then updates the jtable

这听起来确实不正确。 getValueAt()方法通常由 JTable 调用收到事件后。感谢这次 Activity ,JTable知道它必须更新,因此它会查询模型以获取新数据。所以getValueAt方法不会获取更改,但会因更改而被调用。

我强烈建议您查看 Swing table tutorial ,当然还有关于 Creating a table model 的部分, Listening for data changesFiring data change events

关于java - 刷新 JTable 时执行 tableChange(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11547241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com