Java JComboBox-如何呈现时间值的名称

Java JComboBox-如何呈现时间值的名称,java,swing,jcombobox,Java,Swing,Jcombobox,我想显示一个JComboBox,它显示文本值,但存储实际的int值,供用户选择会话超时值 private static final String[] SESSION_TIMEOUT_OPTION_NAMES = new String[]{ "5 Minutes", "10 Minutes", "15 Minutes", ... }; private static final Integer[] SESSION_TIMEOUT_OPTION_VALUES =

我想显示一个
JComboBox
,它显示文本值,但存储实际的int值,供用户选择会话超时值

private static final String[] SESSION_TIMEOUT_OPTION_NAMES = new String[]{
    "5 Minutes", 
    "10 Minutes", 
    "15 Minutes", 
    ...
};

private static final Integer[] SESSION_TIMEOUT_OPTION_VALUES = new Integer[]{
    TimeConstants.FIVE_MINUTES, 
    TimeConstants.TEN_MINUTES, 
    TimeConstants.FIFTEEN_MINUTES, 
    ...
};
我知道这可以通过
ListCellRenderer
实现,但我能看到它工作的唯一方法是使用一个基本上沿着以下行的大型映射:

sessionTimeoutJComboBox.setRenderer(new ListCellRenderer<Integer>()
{
    private DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();

    @Override
    public Component getListCellRendererComponent(...)
    {
        JLabel jlabel = (JLabel)defaultRenderer.getListCellRendererComponent(...);

        for(int x=0; x<SESSION_TIMEOUT_OPTION_VALUES.length; x++)
        {
            if(SESSION_TIMEOUT_OPTION_VALUES[x] == value)
            {
                jlabel.setText(SESSION_TIMEOUT_OPTION_NAMES[x]);
                return jlabel;
            }
        }

        throw new RuntimeException("Invalid mapping");
    }
});
sessionTimeoutJComboBox.setRenderer(新的ListCellRenderer())
{
private DefaultListCellRenderer defaultRenderer=新的DefaultListCellRenderer();
@凌驾
公共组件GetListCellRenderComponent(…)
{
JLabel JLabel=(JLabel)defaultRenderer.getListCellRendererComponent(…);

对于(int x=0;x您可以使用
Map
而不是手动进行映射。例如:

Map<Integer, String> timeoutOptions = new HashMap<>();
timeoutOptions.put( TimeConstants.FIVE_MINUTES, "5 Minutes");
...
Map timeoutOptions=newhashmap();
timeoutOptions.put(TimeConstants.FIVE_MINUTES,“5分钟”);
...
然后在渲染器中,您可以执行以下操作:

sessionTimeoutJComboBox.setRenderer(new DefaultListCellRenderer<Integer>()
{
    @Override
    public Component getListCellRendererComponent(...)
    {
        JLabel label = (JLabel)super.getListCellRendererComponent( ... );
        label.setText( timeoutOptions.get( value ) );
        return label;
    }
});
sessionTimeoutJComboBox.setRenderer(新的DefaultListCellRenderer()
{
@凌驾
公共组件GetListCellRenderComponent(…)
{
JLabel=(JLabel)super.getListCellRenderComponent(…);
label.setText(timeoutOptions.get(value));
退货标签;
}
});

您可以使用
映射,而不是手动进行映射。例如:

Map<Integer, String> timeoutOptions = new HashMap<>();
timeoutOptions.put( TimeConstants.FIVE_MINUTES, "5 Minutes");
...
Map timeoutOptions=newhashmap();
timeoutOptions.put(TimeConstants.FIVE_MINUTES,“5分钟”);
...
然后在渲染器中,您可以执行以下操作:

sessionTimeoutJComboBox.setRenderer(new DefaultListCellRenderer<Integer>()
{
    @Override
    public Component getListCellRendererComponent(...)
    {
        JLabel label = (JLabel)super.getListCellRendererComponent( ... );
        label.setText( timeoutOptions.get( value ) );
        return label;
    }
});
sessionTimeoutJComboBox.setRenderer(新的DefaultListCellRenderer()
{
@凌驾
公共组件GetListCellRenderComponent(…)
{
JLabel=(JLabel)super.getListCellRenderComponent(…);
label.setText(timeoutOptions.get(value));
退货标签;
}
});
您可以使用枚举:

private enum TimeConstants {
    FIVE_MINUTES("5 Minutes", 5),
    TEN_MINUTES("10 Minutes", 10);

    private final String text;
    private final int value;

    private TimeConstants( String text, int value ) {
        this.text = text;
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    @Override
    public String toString() {
        return this.text;
    }
}
下面是如何将它们与JComboBox一起使用:

TimeConstants[] constants = {TimeConstants.FIVE_MINUTES, TimeConstants.TEN_MINUTES};
JComboBox<TimeConstants> combo = new JComboBox<TimeConstants>(constants);
System.out.println( "Selected value: " + ((TimeConstants)combo.getSelectedItem()).getValue());
TimeConstants[]constants={TimeConstants.FIVE_分钟,TimeConstants.TEN_分钟};
JComboBox组合=新的JComboBox(常量);
System.out.println(“所选值:”+((时间常数)combo.getSelectedItem()).getValue());
您可以使用枚举:

private enum TimeConstants {
    FIVE_MINUTES("5 Minutes", 5),
    TEN_MINUTES("10 Minutes", 10);

    private final String text;
    private final int value;

    private TimeConstants( String text, int value ) {
        this.text = text;
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    @Override
    public String toString() {
        return this.text;
    }
}
下面是如何将它们与JComboBox一起使用:

TimeConstants[] constants = {TimeConstants.FIVE_MINUTES, TimeConstants.TEN_MINUTES};
JComboBox<TimeConstants> combo = new JComboBox<TimeConstants>(constants);
System.out.println( "Selected value: " + ((TimeConstants)combo.getSelectedItem()).getValue());
TimeConstants[]constants={TimeConstants.FIVE_分钟,TimeConstants.TEN_分钟};
JComboBox组合=新的JComboBox(常量);
System.out.println(“所选值:”+((时间常数)combo.getSelectedItem()).getValue());

这也是我的首选解决方案;但是,OP希望能够将所选项目强制转换为
int
,这在这种情况下不起作用。如果您要添加
.getValue()
它应该几乎直接返回int…?我不敢相信枚举从未出现在我的脑海中。我想我已经超过了当天的编码限制…这也是我的首选解决方案;但是,OP希望能够将所选项目强制转换为
int
,这在这种情况下不起作用。如果您添加
.getValue()
它应该几乎直接返回int…?我不敢相信枚举从未出现在我的脑海中。我想我已经超过了一天的编码限制…实际上你做不到,因为当你试图从hashmap中获取值列表并将其设置到jcombobox中时,你会失去排序。创建比较器会让你比原始值更糟糕l解决方案(不是字母顺序)。我想你也可以将值存储在数组中,但这违背了本练习的全部目的,而且我相信如果列表较小,你的情况会更糟,因为代码现在要复杂得多(即不太明显)…好主意,当我第一次想到时,它看起来不错,只是当我尝试实例化jcombobox时,它不起作用。实际上你不能这样做,因为当你试图从hashmap中获取值列表以设置到jcombobox中时,你会失去顺序。而创建比较器会让你的情况比原始解决方案更糟(它不是按字母顺序排列的)。我想你也可以将值存储在数组中,但这违背了本练习的全部目的,而且我相信如果列表较小,情况会更糟,因为代码现在要复杂得多(即不太明显)…好主意,当我第一次想到时,它看起来不错,只是当我尝试实例化jcombobox时,它不起作用。不要使用单元格渲染器生成字符串。它会破坏剪贴板操作和可访问性。(剪贴板和屏幕阅读器可以读取模型值的字符串形式,但无法直观显示渲染器绘制的内容。)不要使用单元格渲染器生成字符串。这将中断剪贴板操作和可访问性。(剪贴板和屏幕阅读器可以读取模型值的字符串形式,但无法直观显示渲染器绘制的内容。)