2017-03-04 40 views
1

我有一個JComboBox,我把這種方式,使用其值的enum的JComboBox填補枚舉變量值

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

但是,我想僅在JComboBox中顯示studies值,而不是每次使用StudyGrade枚舉。

我應如何更改代碼,所以每當我使用類似:

System.out.println(StudyGrade.HIGH); 

我得到印刷HIGH代替Universidad,而不是爲JComboBox

+0

你可以向downvoter解釋原因嗎? – Frakcool

回答

1

我重寫toString()方法,這樣我就可以有顯示,而不是那些枚舉的研究價值......

我從來沒有使用之前,枚舉,但我相信你可以像添加到組合框中的任何自定義對象一樣使用它,所以您應該可以使用自定義渲染器,以便可以控制組合框顯示哪些數據。

查看Combo Box With Custom Renderer瞭解更多信息和幫助類。

+0

我目前有事要做,但我會在稍後仔細檢查。謝謝 :) – Frakcool

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

1

您正在尋找擴展枚舉做出了表率,但這是不可能的。這意味着您的要求有問題。

渲染是在UI組件中完成的,並且它不是枚舉的業務來處理數據的顯示。你應該讓你的UI組件按照你喜歡的方式渲染枚舉,而不是試圖讓枚舉理解它被使用的地方。既然你是一個Swing狂熱者,你應該知道如何做到這一點,例如:

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

這就是要做的。