Java 我应该在JComboBox中使用枚举还是字符串

Java 我应该在JComboBox中使用枚举还是字符串,java,swing,Java,Swing,只是遇到了一个小问题,我很困惑,如果有人不介意快速看一下 我的组合框的构造和初始化如下所示,我认为最好将数据保留为枚举,因为选项都是固定的: private JComboBox comboBox=new JComboBox() 但是,当向DefaultComboxModel添加元素时,我意识到我不希望将选项显示为常量(即我不希望选项显示为大写) 因此,我像这样创建了我的枚举(见下文),以便调用jobTitleModel.addElement(JobTitle.Architect.getName(

只是遇到了一个小问题,我很困惑,如果有人不介意快速看一下

我的组合框的构造和初始化如下所示,我认为最好将数据保留为枚举,因为选项都是固定的:

private JComboBox comboBox=new JComboBox()

但是,当向DefaultComboxModel添加元素时,我意识到我不希望将选项显示为常量(即我不希望选项显示为大写)

因此,我像这样创建了我的枚举(见下文),以便调用
jobTitleModel.addElement(JobTitle.Architect.getName())
但很明显,这是行不通的,因为组合框的类型是enum,而不是string

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

所以我真的不知道该怎么做?我可以将组合框和模型更改为字符串,但我想我肯定遗漏了一些明显的东西。谢谢

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

});

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

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);
    }
}
公共类TextableRenderer扩展了DefaultListCellRenderer{
公共组件getListCellRenderComponent(JList列表、对象值、int索引、,
布尔值(已选择,布尔单元格已聚焦){
value=((Textable)value.getText();
返回super.getListCellRenderComponent(列表、值、索引、isSelected、cellHasFocus);
}
}
这将适用于实现可文本接口的任何枚举(或类)

然后使用:

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

使用枚举,但为组合框提供一个适当显示枚举文本的自定义呈现程序。下面是一个示例,我不建议使用名称
getName()
。它很容易与
name()
方法混淆。我通常使用text和
getText()
来处理这些问题guys@HovercraftFullOfEels好的旧
toString()
呢?根据:“…大多数程序员应该优先使用
toString()
方法,因为toString方法可能会返回一个更为用户友好的名称…”很好。很久没有看到你的答案了。@GhostCat:是啊,忙着结束提问!谢谢,这太完美了,它帮助我开始更多地研究渲染器。我一直在避免使用它们:)如果我想为各种组合框和枚举创建一个执行上述操作的方法,那么切换是处理第9行的强制转换的最优雅的方法吗?我现在正在尝试……很好!我真的很喜欢。当我看到所有的代码时,我的第一个想法是‘我想做的事情有很多代码’,但我会去做的。再次感谢,我真的很感激
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);
    }
}
final JComboBox<JobTitle> jobCombo = new JComboBox<>(JobTitle.values());
jobCombo.setRenderer(new TextableRenderer());