2012-07-18 102 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