我应该在JComboBox中使用枚举或字符串

时间:2017-07-04 17:19:56

标签: java swing

我遇到了一个小问题,如果有人不介意快速看一下,我会感到困惑。

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

NaN

但是当向DefaultComboBoxModel添加元素时,我意识到我不想将选项显示为常量(即我不希望选项以大写字母显示)。< / p>

所以我创建了这样的枚举(见下文),以便致电private JComboBox<JobTitle> comboBox = new JComboBox<>(); 但显然,由于ComboBox的类型为enum而不是字符串,因此无法正常工作。

jobTitleModel.addElement(JobTitle.Architect.getName())

所以我不确定如何处理这个问题?我可以将ComboBox和模型更改为String,但我认为我必须在这里遗漏一些明显的东西。感谢

1 个答案:

答案 0 :(得分:3)

为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枚举对象,而不是一个字符串。

关于你的评论:

  

如果我想为各种组合框和枚举制作一个上述方法,那么切换是第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());