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

时间:2014-07-11 21:19:22

标签: 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 = 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");
    }
});

有更好的方法吗?

顺便说一句我想这样做的原因是我可以做到

(int)sessionTimeoutJComboBox.getSelectedItem();

并且不必关心更多。

2 个答案:

答案 0 :(得分:3)

您可以使用枚举:

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

答案 1 :(得分:1)

您可以使用Map而不是手动执行映射。即:

Map<Integer, String> timeoutOptions = new HashMap<>();
timeoutOptions.put( TimeConstants.FIVE_MINUTES, "5 Minutes");
...

然后在你的渲染器中你可以这样做:

sessionTimeoutJComboBox.setRenderer(new DefaultListCellRenderer<Integer>()
{
    @Override
    public Component getListCellRendererComponent(...)
    {
        JLabel label = (JLabel)super.getListCellRendererComponent( ... );
        label.setText( timeoutOptions.get( value ) );
        return label;
    }
});