只是遇到一个小问题,如果有人不介意快速浏览,我会感到困惑。

我的ComboBoxes的构建和初始化如下所示,我认为将数据保留为枚举是一个好主意,因为所有选项都是固定的:

private JComboBox<JobTitle> comboBox = new JComboBox<>();

但是,当将元素添加到DefaultComboBoxModel时,我意识到我不想将选项显示为常量(即,我不想以大写形式显示选项)。

所以我这样创建了我的枚举(见下文)以便调用jobTitleModel.addElement(JobTitle.Architect.getName())
但是很明显,这是行不通的,因为ComboBox是枚举类型,而不是字符串类型。

public enum JobTitle {
    ARCHITECT("Architect"), TOWN_PLANNER("Town Planner"), URBAN_DESIGNER("Urban Designer"), LANDSCAPE_GARDENER("Landscape Gardener");

    private final String name;

    private JobTitle(String name){
        this.name = name;
    }

    public String getName(){
         return this.name;
    }
}


所以我不太确定该如何处理?我可以将ComboBox和模型更改为String,但是我想我这里必定缺少明显的东西。谢谢

最佳答案

为JComboBox使用自定义渲染器。例如,以下代码使用从默认列表单元格渲染器扩展的渲染器。它要做的就是获取保存在JComboBox的每个单元格中的值,即JobTitle对象,从该对象中提取名称,并显示名称:

JComboBox<JobTitle> jobCombo = new JComboBox<>(JobTitle.values());
jobCombo.setRenderer(new DefaultListCellRenderer() {

    public Component getListCellRendererComponent(JList<?> list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus) {
        value = ((JobTitle) value).getName();
        return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    }

});


为什么这样现在,如果用户从组合框中选择一个项目,则它是完整的JobTitle枚举对象,而不是字符串。



关于您的评论:


  如果我想做一个对各种comboBoxes和enum进行上述操作的方法,那么开关是处理第9行转换的最优雅方法吗?


这是一个全新的问题,可能应该单独发布,但是一个可能的解决方案是为所有枚举提供相同的接口,例如:

public enum JobTitle implements Textable {
    ARCHITECT("Architect"), TOWN_PLANNER("Town Planner"), URBAN_DESIGNER(
            "Urban Designer"), LANDSCAPE_GARDENER("Landscape Gardener");

    private final String text;

    private JobTitle(String name) {
        this.text = name;
    }

    @Override
    public String getText() {
        return text;
    }
}




public interface Textable {
    String getText();
}


然后创建自己的渲染器类:

public class TextableRenderer extends DefaultListCellRenderer {
    public Component getListCellRendererComponent(JList<?> list, Object value, int index,
            boolean isSelected, boolean cellHasFocus) {

        value = ((Textable) value).getText();

        return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    }
}


这将与实现Textable接口的任何枚举(或类)一起使用。

然后用:

final JComboBox<JobTitle> jobCombo = new JComboBox<>(JobTitle.values());
jobCombo.setRenderer(new TextableRenderer());

08-17 11:14