2013-08-02 42 views
2

我有一個JComboBox,其中的項目是查詢的結果。組合顯示從查詢中獲取的所有類別名稱,對嗎?好的,它的工作原理。現在我需要給每個項目一個值,這將是產品的ID。將值和標籤設置爲JComboBox

這是我到目前爲止有:

final JComboBox proveedorCombo = new JComboBox(); 

    contentPanel.add(proveedorCombo); 

    ProveedorDAO dao = new ProveedorDAO(); 

    List<Proveedor> proveedor = dao.getAll(); 

    Object[][] elementos = new Object[proveedor.size()][2]; 

    for (int i = 0; i < proveedor.size(); i++) { 
     Proveedor p = proveedor.get(i); 
     elementos[i][0] = p.getId(); 
     elementos[i][1] = p.getNombre(); 
     proveedorCombo.addItem(elementos[i][1]); 
    } 

正如你可以在代碼中看到,每個項目的「標籤」是它的名字。現在,我如何設置每個項目的ID以便我可以操作?

謝謝並嘗試回答容易,我最難得到這個Java事情!哈!

回答

2

JComboBox默認情況下使用渲染器,使用toString()方法顯示對象數據。所以你可以讓你自己的渲染類來定製視圖。

這是它的設計方式。

proveedorCombo.setRenderer(new DefaultListCellRenderer(){ 

     @Override 
     public Component getListCellRendererComponent(
      JList list, Object value, int index, 
      boolean isSelected, boolean cellHasFocus) 
     { 
      super.getListCellRendererComponent(list, value, index, 
       isSelected, cellHasFocus); 

       if(value != null){ 
       Proveedor proveedor = (Proveedor)value; 
       setText(proveedor.getName()); 
       } 
      return this; 
     } 
}); 

另一個哈克的方法是從Proveedor覆蓋toString()或製備使用您的適配器類的toString()但這種方法並不像其他的一大部分靈活。

public class Proveedor { 

//in some part 
@Override 
public String toString(){ 
    return this.nombre; 
} 

} 

在組合框中,如果你想從零填充。

proveedorCombo.setModel(new DefaultComboBox(new Vector<Proveedor>(dao.getAll()))); 

或者,如果你有以前的數據,你想保持。

for(Proveedor p : dao.getAll){ 
    proveedorCombo.addItem(p); 
} 
+0

-1覆蓋的toString _view_原因,要走的路是一個自定義渲染 – kleopatra

+1

是的,你得到了它的權利......我採取簡單的方法,我把適配器類的渲染,但從來沒有一個例子,我會編輯 – nachokk

+0

不錯的嘗試 - 只是不夠好,當我在追求骯髒的做法 _Two選項_意味着兩者將近似在相同水平的可推薦性(huch ..是一個字嗎?,懶得問Leo) - 在這裏肯定不是這樣,一個是它被設計的方式,另一個是一個快速和骯髒的黑客,這是在任何最微不足道的情況下的死衚衕 – kleopatra