2012-08-07 94 views
3

我在JTable中有一列與業務對象列表上的基礎布爾屬性綁定。我也有一個組合框,它應該選擇哪些項目應該被選中。我基本上都添加以下代碼作爲一個處理程序的組合框:Java Swing - 通知GUI有關對模型的更改

  macroCombo.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        JComboBox comboBox = (JComboBox) e.getSource(); 
        Predicate filter = (Predicate) comboBox.getSelectedItem(); 
        for(SelectableKey key : tableEntries){ 
         key.setSelected(filter.evaluate(key)); 
        } 
       } 
      }); 

我也有我想基於該值來改變一些其他控件。此時,表格中只有少數幾個單元格會改變其狀態以被選中/取消選擇。只有當我點擊該行或選擇多行時,UI纔會自行更新。我需要做出告訴GUI重繪的處理函數嗎? ALos,如果我修改JTable以外的其他控件,我會如何告訴他們改變他們的狀態?

感謝

回答

8

當您更新您的TableModel一個值,該模型應該解僱相應TableModelEvent(類型:UPDATE)。

如果您的TableModel例如從AbstractTableModel延伸,您可以在做出更改後調用fireTableRowsUpdated方法。

另一種方法是TableModel,它知道它何時被更新(例如,通過向其包含的對象添加偵聽器)。這允許其他代碼只需更新TableModel中包含的對象,而不需要知道TableModel。當它檢測到對其包含的對象所做的更改時,它自己將觸發該事件。

我更喜歡第二種方法,因爲這樣可以避免我必須將TableModel傳遞給所有其他類。

有關更多信息,請參閱table tutorial

+0

因此,在第二種方法中,您需要將TableModel作爲偵聽器添加到支持它的每個業務對象,並且每當它們發生更改時,都會引發該模型挑選的事件? – Bober02 2012-08-07 14:08:23

+0

@ Bober02知道表模型的表模型或偵聽器(例如表模型中的匿名類) – Robin 2012-08-07 14:45:20