我想使JComboBox
组件显示String
名称,而不是引用。但是,我不知道如何做到这一点。
下面显示了我的代码:
public class Properties extends JPanel implements ItemListener {
private static final long serialVersionUID = -8555733808183623384L;
private static final Dimension SIZE = new Dimension(130, 80);
private JComboBox<Category> tileCategory;
public Properties() {
tileCategory = new JComboBox<Category>();
tileCategory.setPreferredSize(SIZE);
tileCategory.addItemListener(this);
this.setLayout(new GridLayout(16, 1));
loadCategory();
}
private void loadCategory() {
//Obtains a HashMap of Strings from somewhere else. All of this is constant, so they
//aren't modified at runtime.
HashMap<Integer, String> map = EditorConstants.getInstance().getCategoryList();
DefaultComboBoxModel<Category> model = (DefaultComboBoxModel<Category>) this.tileCategory.getModel();
for (int i = 0; i < map.size(); i++) {
Category c = new Category();
c.name = map.get(i + 1);
model.addElement(c);
}
this.add(tileCategory);
}
}
我唯一知道的是我将Category
课传递给了JComboBox
。下面显示了Category
类:
public class Category {
public String name;
}
就是这样。
我唯一的目标是让Category.name
成员变量显示在JComboBox
下拉列表中,矩形在图片中标记。
有人能告诉我这是怎么做到的吗?提前谢谢。
答案 0 :(得分:7)
JComboBox
使用ListCellRenderer
来自定义值的呈现方式。
请查看Providing a Custom Renderer了解详情
例如......
public class CategoryListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof Category) {
value = ((Category)value).name;
}
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); //To change body of generated methods, choose Tools | Templates.
}
}
然后你只需指定组合框的渲染
tileCategory.setRenderer(new CategoryListCellRenderer());
现在,已经说过,这将阻止用户使用搜索功能中内置的组合框。
为此,请检查Combo Box With Custom Renderer是否可以解决问题。这是由我们自己的camickr
撰写的答案 1 :(得分:4)
最简单的方法是覆盖班级的toString()
方法。这不是一个非常强大的解决方案,但可以完成工作。
public class Category {
public String name;
@Override
public String toString(){
return name;
}
}