2011-08-16 90 views
2

的建議我有幾個帶有自定義模型的JComboBox。基本上它們用於顯示某些JTable列的值(因此我決定在擴展AbstractTableModel的類 的相應類上實現它們)。關於如何在我的項目中調試ComboBoxModel

public class MyTableModel1 extends AbstractTableModel{ 

    protected class MyTableComboBoxModel1 extends AbstractListModel implements ComboBoxModel{ 

     private Object selected; 
     @Override 
     public Object getElementAt(int index) { 
      return getValueAt(index, 1); 
     } 

     @Override 
     public int getSize() { 
      return getRowCount(); 
     } 

     @Override 
     public Object getSelectedItem() { 
       return this.selected; 

     } 

     @Override 
     public void setSelectedItem(Object anItem) { 
        this.selected = anItem; 
     } 

    } 
} 

而我有幾個模型:MyTableModel2與MyTableComboBoxModel2。這些模型都做相同的事情,除了一些額外的操作既不與組合框相關也不與表本身相關。

所有這些東西的目的應該是相應地更新JComboBox的顯示值以發生相對JTable的修改。

對於我已經實現的模型,除了在一種情況下,以及在幾個小時的調試後,我仍然無法解決它,所有的工作都很好。竊聽模型的代碼與其他代碼幾乎相同。也許這是我的代碼中的其他地方的錯誤,但我無法弄清楚在哪裏。

錯誤的情況下,有以下行爲:當我最初創建一個表,一些值,這些都是正確的,即使在JComboBox中顯示,但是當我添加一個新行顯示的值成爲所有空白(顯示空白的大小菜單是正確的)。 我發現:

  1. jtable的新行被正確添加。
  2. getElementAt方法在JComboBox上單擊時會被調用幾次,並返回所有可用的值(包括新值)。
  3. 方法的getSize()當我點擊的JComboBox並返回正確的更新後的值
  4. 如果JComboBox中具有焦點,我可以使用箭頭鍵選擇可用的項目,所有項目都選擇(甚至增加的)被調用。
  5. 如果我使用鼠標在顯示的空白菜單上隨意點擊一個點,可以選擇最後一個可用條目。

有沒有人有任何想法?你能建議我在這種情況下如何調試?不幸的是我不能發佈一個SSCCE ..我希望有人能夠幫助反正..

+0

可能在添加項目後調用combo.revalidate()。 – toto2

+0

@toto:我試過但重新驗證沒有解決問題 – Heisenbug

+0

嘗試在不同的平臺上?還是不同的外觀? – toto2

回答

2

我知道,我的問題是有點含糊

這就是爲什麼需要一個SSCCE。

每個組合框應顯示所有的現有的JTable

特定列的,我不明白爲什麼你需要自定義模型中的價值。我猜你只需要使用TabelModelListener。

無論何時添加/刪除值,都會更新組合框。

+0

正確的建議通過使用您的變通方法CellListener + 1 – mKorbel

+0

@camickr:+1。我想你是對的。即使應該可以編寫自定義模型,在這種情況下,也許TableModelListener更好。我沒有想到這一點。 – Heisenbug