最近我遇到了一个问题,我在ArrayList中填充了对象
ArrayList<Item> allItems;
虽然每个Item对象都有自己的属性,如String name
或
int value
。在我的图形界面中,我想让JComboBox只填充Item
ArrayList中每个allItems
对象的名称值。
allItems
内的对象在我的程序的运行时添加,并且在开头没有值。在我的ArrayList中添加一个新项后,我调用
comboBox.setModel(new javax.swing.DefaultComboBoxModel(allItems.toArray()));
但这只会给我一些像items.Item@283ae01
这样的东西。是否可以仅在ComboBox中的ArrayList中显示每个项的值String name
?
答案 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更改(而不是每次都重新创建模型)。
还有其他一些例子答案 1 :(得分:0)
您需要创建自定义渲染器以显示类中的相应属性。但是,自定义渲染器只是解决方案的一半,因为您将破坏组合框的默认功能以使用键盘选择项目。
有关执行渲染的实现,请参阅Combo Box With Custom Renderer,并且仍允许在组合框中选择键盘和项目。