2011-09-15 80 views
2

我已經從數據庫填充了組合框B1。當itemStateChanged事件引發它應該填充另一個組合框B2,但它不工作。Java Swing dynamic JComboBox

ArrayList1 = //call method in database connection class() 
for (int j = 0; j < ArrayList1.size(); j++) 
{ 
    if (j == 0) 
    { 
     combobox1.addItem("Select Any"); 
    } 
    combobox1.addItem(ArrayList1.get(j)); 
} 


combobox1.addItemListener(new ItemListener() 
{ 
    @Override 
    public void itemStateChanged(ItemEvent ie) 
    { 
     String catName = (String)combobox1.getSelectedItem(); 
     if (!catName.equalsIgnoreCase("Select Any")) 
     { 
      ArrayList2=//call method in DB class with cat_name as argument 
      for(int i=0;i < ArrayList2.size();i++) 
      { 
       if (i == 0) 
       { 
        combobox2.addItem("Select Any"); 
       } 
       combobox2.addItem(ArrayList2.get(i));     
      }     
     } 
    }   
}); 

第一個組合框從數據庫中獲取填充,但從其中選擇任何項後,第二個組合框保持空白。

爲什麼調試這個我的電腦掛了?

+1

問題:在調用數據庫之後,您是否檢查過Array_list2是否爲空?在這裏添加跟蹤將確保問題不在您的示例中未顯示的代碼中(DB方法)。 – jfpoilpret

+0

但是當我要去調試它然後它會掛電腦??然後我怎麼能調試它? – Geetanjali

+2

請學習java命名約定並堅持到他們 – kleopatra

回答

1
DefaultComboBoxModel model = new DefaultComboBoxModel(yourstringarray); 
        item_combobox.setModel(model); 

ňMA問題得到解決....

2

你在ArrayListVector來實現ComboBoxModel,並添加/刪除/在Model改變Items,而不是在JComboBox,也不是地方,肯定是可行的,但你必須在美國東部時間執行代碼,並經常更換ArrayListVector用於澆築JComboBox,不這樣做,是這樣:-)

也許你有Concurency in the Swing問題,也許變化都做了,但是外面EDT,更多關於您的問題pass events wrapped into invokeLater()multiple-jcombobox

+1

+1建議使用模型。不過,我認爲這不會解決問題。 – jfpoilpret

+0

更改在EDT內完成,因爲代碼是從一個'ItemListener'執行的;因此在該示例中沒有特定的線程問題(除了數據庫訪問最好使用'SwingWorker'執行,但這不是問題的根源)。 – jfpoilpret

+0

我已經實現了combobox model.n ma問題得到解決。 – Geetanjali

0

您必須閱讀:

http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html

它會幫助你處理與Java組合框。

似乎應該使用ActionListener作爲事件來填充第二個組合框。

爲了您的調試問題,你應該檢查bug 6714678從Java的錯誤追蹤系統

-Dsun.awt.disablegrab=true 

應該解決您的調試問題(自2008年)

見不能爲老版本的JDK工作作爲2007年的相關bug 6517045說:

經過討論,我們得出結論,這(調試組合框事件)只是一個更多的地方,當它不是 明智地在調試器中停止(對於DnD,全屏也是如此)。