Java - 如何使非String对象的JComboBox显示字符串名称?

时间:2014-06-12 08:32:36

标签: java string swing object jcombobox

Imgur

我想使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下拉列表中,矩形在图片中标记。

有人能告诉我这是怎么做到的吗?提前谢谢。

2 个答案:

答案 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;
    }
}