首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用枚举变量值填充JComboBox

用枚举变量值填充JComboBox
EN

Stack Overflow用户
提问于 2017-03-04 23:04:55
回答 3查看 1.3K关注 0票数 1

我有一个这样做的JComboBox,它的值使用一个enum

代码语言:javascript
复制
JComboBox<StudyGrade> maxLevelOfStudiesCombo = new JComboBox<StudyGrade>(StudyGrade.values());

enum看起来如下所示:

代码语言:javascript
复制
public enum StudyGrade {
    ELEMENTARY ("Primaria"),
    MIDDLE ("Secundaria"),
    MIDDLE_HIGH ("Preparatoria"),
    HIGH ("Universidad"),
    MASTERS ("Maestría / Posgrado"),
    DOCTORATE ("Doctorado"),
    POST_DOCTORATE ("Post Doctorado");

    private String studies;

    private StudyGrade(String studies) {
        this.studies = studies;
    }

    public String getStudies() {
        return studies;
    }

    public void setStudies(String studies) {
        this.studies = studies;
    }

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

如您所见,我正在重写toString()方法,因此我可以显示studies值而不是enum值.

但是,我希望只在JComboBox中显示JComboBox值,而不是每次使用StudyGrade枚举时。

我将如何更改代码,因此每当我使用以下内容时:

代码语言:javascript
复制
System.out.println(StudyGrade.HIGH);

我得到的是HIGH而不是Universidad,但不是JComboBox

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-04 23:31:22

我正在重写toString()方法,因此我可以显示研究值,而不是枚举值。

我以前从未使用过枚举,但我假设您可以像添加到组合框中的任何自定义对象一样使用它,因此您应该能够使用自定义呈现器,从而可以控制组合框显示哪些数据。

有关更多信息和帮助类,请查看组合框与自定义渲染器

票数 1
EN

Stack Overflow用户

发布于 2017-03-05 00:42:43

你想要延长一个枚举,但那是不可能的。这意味着你的要求出了问题。

呈现是在UI组件中完成的,处理数据表示不是enum的职责。您应该让UI组件按照您想要的方式呈现enum,而不是试图让enum了解它的使用位置。既然你是个挥棒狂,你应该知道怎么做,就像这样:

代码语言:javascript
复制
maxLevelOfStudiesCombo.setRenderer(new DefaultListCellRenderer() {
    @Override
    public Component getListCellRendererComponent(JList<?> jList, Object o, int i, boolean b, boolean b1) {
        Component rendererComponent = super.getListCellRendererComponent(jList, o, i, b, b1);
        setText(o instanceof StudyGrade ? ((StudyGrade) o).getStudies() : o.toString());
        return rendererComponent;
    }
});

那样就行了。

票数 1
EN

Stack Overflow用户

发布于 2017-03-04 23:48:40

您可以将toString覆盖移除为枚举的默认toString是返回enum元素的名称。

您可以使用一个简单的for循环来迭代枚举中的值,并将其添加到字符串数组中。然后,您需要将该数组作为JComboBox的参数传递,并且它应该是黄金。

它的代码应该看起来有点像这样:

代码语言:javascript
复制
//get all study grades
StudyGrade[] temp = StudyGrade.values(); 

//create a string array of same length as the array
String[] str = new String[temp.length];

//append all the studies value to the string array
for(int i = 0; i< temp.length; i++){
  str[i] = temp[i].getStudies();
  System.out.println(temp[i]);//debug
}

System.out.println("---------------------");//debug
for(String s : str){//debug
  System.out.println(s);//debug
}//debug

//pass it
JComboBox<StudyGrade> maxLevelOfStudiesCombo = new JComboBox<StudyGrade>(StudyGrade.values());

下面是我在repl.it上做的一个例子

https://repl.it/GH28/1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42602405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档