0

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

我希望这有帮助

4

1 回答 1

3

我怎么知道有些事情发生了变化并且表已经更新,而 jtable 本身没有发生事件?

中从来没有事件JTableTableModel改变的是底层TableModel,触发事件的是底层。向JTable注册一个侦听器,TableModel以便它知道何时应该更新显示的表格内容。

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

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

根据您的评论,我最好的猜测是您的实现不正确,TableModel并且您TableModel根本没有触发事件,并且JTable“意外”更新了(根据我的经验,JTable对于丢失的事件来说是相当强大的,当然当没有添加/删除行时...与 a 相比明确JTree

getValueAt() 方法获取更改,然后更新 jtable

这听起来确实不正确。该getValueAt()方法通常JTable在收到事件后被调用。由于该事件,它JTable知道必须更新它,因此它会查询模型以获取新数据。因此,该getValueAt方法不会获取更改,而是作为更改的结果被调用。

我强烈建议看一下Swing 表教程,当然还有关于创建表模型侦听数据更改触发数据更改事件的部分

于 2012-07-18T21:11:51.353 回答