2012-07-18 106 views
0

在我的表单中,我有一个带有TableModelListener的JTable。 tableChanged方法更新我的JButton上的逻辑。这一切正常工作。当用户在jtable的单元格中编辑值时 - 执行tableChanged方法并相应地刷新按钮。tableChange()在刷新JTable时执行

我有问题,它是一个表演塞。 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 { 

我希望这有助于

+0

的部分如何JTable的小区变更没有改变TableModel中? – 2012-07-18 17:54:49

+0

不知道...,为更好的帮助,尽早发布SSCCE – mKorbel 2012-07-18 18:34:53

+0

getValueAt()方法获取更改,然后更新jtable – jkteater 2012-07-18 18:42:06

回答

3

我怎样才能知道事情有了变化,没有一个事件发生在JTable本身的表已经更新?

JTable从来没有发生过任何事件。这是变化的底层TableModel,并且它是触发事件的TableModelJTable将一个监听器注册到TableModel,以便它知道它应该何时更新显示的表格内容。

所以,如果你说JTable得到更新(自动,所以没有你滚动/选择/悬停/ ...)意味着TableModel不会触发一个事件,这意味着你也可以听它。

在这种情况下,您的应用程序中更改了TableModel的某个元素,应从TableModel中触发TableModelEvent。通常,这可以通过让TableModel监听其包含的对象中的更改,或者让更改对象的代码也通知TableModel底层数据已更改。无论哪种方式,TableModel需要触发一个事件,所以没有任何理由为什么你的听众不会收到它,除非它不被触发(意思是不正确的TableModel)。

我最好的猜测,根据您的意见,是你有一个不正确的执行你的TableModel和你TableModel根本不会触发事件,并且该JTable被“意外”更新(在我的经验是JTable而强大的失踪事件,肯定是当不添加行/删除... definetely相比JTree

的getValueAt()方法拿起变化,然后更新JTable中

氏这听起来不正确。 getValueAt()方法在收到事件后通常由JTable调用。感谢此事件,JTable知道它必须更新,以便查询模型中的新数据。所以getValueAt方法不会接受更改,但会因为更改而被调用。

我强烈建议采取看看Swing table tutorial,肯定约Creating a table modelListening for data changesFiring data change events

+0

你是对的,jtable不会自动刷新更改。当单击单元格或调整对话框大小时,可能会出现更改。但这些操作不会导致tableChanged事件。如果我添加一行或删除一行,请编辑一个单元格。这些都导致tableChanged事件运行。 – jkteater 2012-07-19 15:10:15

+0

这意味着你不会触发相应的事件。这取决于'TableModel'来处理这个问题,但它不会自动发生。你将不得不为它编写一些代码 – Robin 2012-07-19 17:18:09