2013-02-11 78 views
5

我有一个ID,名称一Proveedores类,姓氏,我想添加这个对象到组合框。修改toString()方法的JComboBox摇摆

 ListIterator listaNombre = listaProveedores.listIterator(); 
     listado = new Proveedores[listaProveedores.size()]; 
     int cont = 0; 
     while (listaNombre.hasNext()) { 
      prov = (Proveedores) listaNombre.next(); 
      listado[cont] = prov; 
      cont++; 
     } 
this.vista.cArticuloFamilia.setModel(new javax.swing.DefaultComboBoxModel(listado)); 

使用此代码,我将不同的对象添加到组合框中。有用。但是现在我想重写toString方法来仅显示Name属性。现在,组合框向我展示了名称类(Proveedores)和ID。

entidades.Proveedores[idProveedores=1] 

如何覆盖它以显示Proveedores名称?

谢谢。

+0

你为什么不继承Proveedores来覆盖该方法? – Mirco 2013-02-11 18:10:52

+0

谢谢。我爱你 – Filowk 2013-02-11 18:14:07

+7

更好 - 不要依赖'toString()',而是使用自定义渲染器。 'toString()'方法覆盖应该用于程序调试,而不是用于显示给用户。 – 2013-02-11 18:16:42

回答

9

使用自定义ListCellRenderer来完成此操作。

您不应该定制toString()来为复杂对象生成GUI数据。它是为了开发人员眼睛而不是用户的内部数据表示。

+0

Couldn”我自己说得更好。 1+ – 2013-02-11 18:20:33

+0

+1阿门....... – MadProgrammer 2013-02-11 19:41:28

+1

同样在这里 - 令人难以置信的是怎么的toString误用正在蔓延,这些天...... – kleopatra 2013-02-12 10:45:16

6

Java使用toString()默认情况下获取对象的字符串表示形式,它将返回完全限定的classname @,接着是对象的hashCode。

使用ListCellRenderer在组合框显示Proveedores名称。

示例代码:

public static class ProveedoresRenderer extends DefaultListCellRenderer { 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     Object item = value; 

     // if the item to be rendered is Proveedores then display it's Name 
     if(item instanceof Proveedores) { 
      item = ((Proveedores) item).getName(); 
     } 
     return super.getListCellRendererComponent(list, item, index, isSelected, cellHasFocus); 
    } 
} 

然后设置ProveedoresRendererJComboBox中

ListIterator listaNombre = listaProveedores.listIterator(); 
listado = new Proveedores[listaProveedores.size()]; 
int cont = 0; 
while (listaNombre.hasNext()) { 
    prov = (Proveedores) listaNombre.next(); 
    listado[cont] = prov; 
    cont++; 
} 
this.vista.cArticuloFamilia.setModel(new javax.swing.DefaultComboBoxModel(listado)); 

// Set custom renderer to the combobox 
this.vista.cArticuloFamilia.setRenderer(new ProveedoresRenderer());