来自对象arraylist的JComboBox值

时间:2015-04-11 18:58:20

标签: java arraylist

最近我遇到了一个问题,我在ArrayList中填充了对象

ArrayList<Item> allItems;

虽然每个Item对象都有自己的属性,如String nameint value。在我的图形界面中,我想让JComboBox只填充Item ArrayList中每个allItems对象的名称值。 allItems内的对象在我的程序的运行时添加,并且在开头没有值。在我的ArrayList中添加一个新项后,我调用

comboBox.setModel(new javax.swing.DefaultComboBoxModel(allItems.toArray()));

但这只会给我一些像items.Item@283ae01这样的东西。是否可以仅在ComboBox中的ArrayList中显示每个项的值String name

2 个答案:

答案 0 :(得分:0)

默认渲染器使用列表中对象的toString方法来渲染项目。您可以a)覆盖添加到JComboBox的类的toString方法,以提供正确的名称呈现

@Override
public String toString(){
    return name;
}

或b)为JComboBox提供自定义渲染器,自定义用于渲染JComboBox中项目的Component

ListCellRenderer renderer = new DefaultListCellRenderer(){
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if ( value == null ){
            return c;
        }
        if ( c instanceof JLabel ){
            JLabel label = (JLabel)c;
            Test t = (Test)value;
            label.setText(t.getName());
        }
        return c;
    }
};
myComboBox.setRenderer(renderer);

注意上面是pre-java 7语法。在java 7及更高版本中,这些类使用泛型进行参数化。

您可以进一步创建由List支持的自己的模型,因此当项目添加到List时,您可以激活相应的侦听器以通知JComboBox更改(而不是每次都重新创建模型)。

java tutorial on using JComboBoxes

还有其他一些例子

答案 1 :(得分:0)

您需要创建自定义渲染器以显示类中的相应属性。但是,自定义渲染器只是解决方案的一半,因为您将破坏组合框的默认功能以使用键盘选择项目。

有关执行渲染的实现,请参阅Combo Box With Custom Renderer,并且仍允许在组合框中选择键盘和项目。