我想显示一个显示文本值的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();
并且不必关心更多。
答案 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;
}
});