Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何使非字符串对象的JComboBox显示字符串名称?_Java_String_Swing_Object_Jcombobox - Fatal编程技术网

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

Java-如何使非字符串对象的JComboBox显示字符串名称?,java,string,swing,object,jcombobox,Java,String,Swing,Object,Jcombobox,我想让JComboBox组件显示String名称,而不是引用。然而,我不知道这是怎么做到的 下面是我的代码: public class Properties extends JPanel implements ItemListener { private static final long serialVersionUID = -8555733808183623384L; private static final Dimension SIZE = new Dimension(13

我想让
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);
    }
}
就这样

我唯一的目标是获得
类别。name
成员变量显示在
JComboBox
下拉列表中,在该列表中,矩形在图片中标记


有人能告诉我怎么做吗?提前感谢。

A
JComboBox
使用
ListCellRenderer
来定制值的呈现方式

请查看以了解更多详细信息

例如

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.

    }

}
话虽如此,这将阻止用户使用内置搜索功能的组合框


为此,检查可能的解决方法。这是由我们自己的camickr编写的

最简单的方法是重写类的
toString()
方法。这不是一个非常健壮的解决方案,但可以完成任务

public class Category {
    public String name;

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

toString
对于做出渲染决策来说是一个糟糕的选择,您可能并不总是希望在各种组件中以相同的方式渲染值,这就是为什么存在渲染器的原因<代码>toString应限制为提供调试information@MadProgrammerDefaultXxxRenderer即将进行字符串(编辑),允许在JList/JComboBox中有两个相同的(描述)项,而不存在索引问题(否则返回最近的索引)@mKorbel但是仅仅为了表示的目的修改a类的
toString
方法是个坏主意。同意,这是一个非常简单的类,但是如果它变得更复杂,OP想要在这个组合框或那个列表中以不同的方式显示它…那么他们就会遇到问题,只是说…你完全正确,这就是为什么我添加了关于它的评论。但这是最快的方式来完成,OP想要的。@mad程序员看到我对我的原始评论的编辑,我希望你知道这个问题你必须喜欢盲下投票。它不允许人们从答案中学习或改进答案,但渲染器会破坏可访问性和剪贴板操作(如您所述,还有键盘导航)。最好用自定义的
toString
方法创建一个包装类。@VGR虽然我同意你的主要观点,但可访问性和剪贴板操作是可以改进的,至于键盘操作,让我们说API需要更好的设计,但是对于覆盖
toString
进行表示,这可能是最糟糕的事情,因为对象在所有情况下都不会以相同的方式呈现,
toString
最好留给调试,但这就是MHO;)对的这就是为什么我推荐一个自定义包装类(比如,
CategoryItem
),而不是修改Category.toString。@vgr IMHO它是有限的,除非您突然也要将html注入
toString
方法:P
tileCategory.setRenderer(new CategoryListCellRenderer());
public class Category {
    public String name;

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