修改toString()方法JComboBox Swing

Fil*_*owk 5 java swing jcombobox

我有一个带有ID,Name,Lastname的Proveedores类,我希望将这个对象添加到组合框中.

      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));
Run Code Online (Sandbox Code Playgroud)

使用此代码,我将不同的对象添加到组合框中.有用.但是现在我想为show only Name属性覆盖toString方法.现在,combobox向我展示了名称类(Proveedores)和ID.

entidades.Proveedores[idProveedores=1]
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Rob*_*bin 9

使用自定义ListCellRenderer来完成此任务.

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


Gna*_*amy 8

Java使用toString()来获取Object的String表示形式,默认情况下它将返回完全限定的classname @,后跟对象的hashCode.

使用ListCellRenderer在ComboBox中显示Proveedores Name.

示例代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将ProveedoresRenderer设置为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));

// Set custom renderer to the combobox
this.vista.cArticuloFamilia.setRenderer( new ProveedoresRenderer() );
Run Code Online (Sandbox Code Playgroud)