class ComboItem {
int id;
String name;
ComboItem(int id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
return Integer.toString(this.id) + "-" + this.name;
}
public int getItem() {
return this.id;
}
}
我创建了一个JComboBox,我填充了包含两个变量的项:id和name(上面显示的代码)。我重写了toString函数,以便组合框显示两个字段 - 在它们之间。我想要做的是当用户从下拉列表中选择某些内容时仅显示id。我希望用户在单击箭头时能够看到id和名称,但是我希望组合框在用户选择后只显示id。我怎样才能做到这一点?感谢。
答案 0 :(得分:0)
答案 1 :(得分:0)
您应该实现自己的ListCellRenderer。 请参阅JComboBox#setRenderer方法。
例如:
JComboBox<ComboItem> comboBox = new JComboBox<>(new ComboItem[]{new ComboItem(1, "test")});
comboBox.setRenderer(new ListCellRenderer<ComboItem>() {
@Override
public Component getListCellRendererComponent(JList<? extends ComboItem> list, ComboItem value, int index, boolean isSelected, boolean cellHasFocus) {
return new Label(Integer.toString(value.getItem()));
}
});
答案 2 :(得分:0)
你需要做两件事:
KeySelectionManager
(因为自定义渲染器会破坏组合框的默认功能。请参阅Combo Box With Custom Renderer以获取更多信息以及为您完成上述任何操作的解决方案。
您需要自定义渲染器实现(除了上面链接中给出的建议)。所选值的索引将为-1。因此,您需要在渲染器中使用代码来显示所选值与下拉列表中的值。类似的东西:
if (index == -1)
// display the id
else
// display the id and name
答案 3 :(得分:0)
感谢各位用户的评论,我能够提出一个适合我的解决方案。我会在这里发布,以防有人可能从中受益。 我在类中重写了toString()函数,只显示项的id。显然,JComboBox通过调用toString()函数显示所选项。然后我编写了另一个名为full()的函数,它将id和名称一起显示出来。最后,我实现了一个ListCellRenderer,如果选择了该项(index == -1),则调用toString(),如果未选择该项,则调用full()。
class ComboItem {
int id;
String name;
ComboItem(int id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
return Integer.toString(this.id);
}
public String full() {
return Integer.toString(this.id) + "-" + this.name;
}
}
class MyComboRenderer extends JLabel implements ListCellRenderer {
public MyComboRenderer () {
setOpaque(true);
setHorizontalAlignment(CENTER);
setVerticalAlignment(CENTER);
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
ComboItem c = (ComboItem) value;
if (index == -1)
setText(c.toString());
else
setText(c.full());
return this;
}
}