刷新JTable时执行tableChange()

时间:2012-07-18 17:42:15

标签: java swing jtable

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

我希望这会有所帮助

1 个答案:

答案 0 :(得分:3)

  

如果没有在jtable本身发生事件,我该如何判断某些内容已发生变化且表格已更新?

JTable中从未发生过任何事件。它是基础TableModel的变化,而TableModel则会触发事件。 JTableTableModel注册一个监听器,因此它知道何时应该更新显示的表内容。

所以如果你说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 modelListening for data changesFiring data change events

的部分