JComboBox填充枚举变量值

时间:2017-03-04 23:04:56

标签: java swing enums jcombobox

我有JComboBox我这样做,使用enum作为其值:

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

enum看起来像这样:

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个值...

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

我将如何更改代码,因此无论何时我使用类似的内容:

System.out.println(StudyGrade.HIGH);

我打印的是HIGH而不是Universidad,但不是JComboBox

3 个答案:

答案 0 :(得分:1)

  

我正在覆盖toString()方法,因此我可以显示研究值而不是枚举值...

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

查看Combo Box With Custom Renderer以获取更多信息和帮助类。

答案 1 :(得分:1)

你正在寻求扩展枚举,但这是不可能的。这意味着你的要求出了问题。

渲染是在UI组件中完成的,处理数据表示并不是enum的业务。您应该按照自己喜欢的方式使用UI组件渲染枚举,而不是尝试让枚举理解它的使用位置。既然你是一个摇摆狂热者,你应该知道如何做到这一点,如下:

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;
    }
});

那将会那样做。

答案 2 :(得分:0)

您可以将toString覆盖删除为the default toString for an enum is to return the name of the enum element

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

它的代码看起来应该是这样的:

//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