在我的表单中,我有一个带有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会触发事件。
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的部分

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

10-13 05:32