jcomboBox在下拉列表中有两列但只有一个选定值

时间:2014-01-28 18:21:21

标签: java swing jcombobox

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。我怎样才能做到这一点?感谢。

4 个答案:

答案 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)

你需要做两件事:

  1. 创建自定义渲染器
  2. 实施KeySelectionManager(因为自定义渲染器会破坏组合框的默认功能。
  3. 请参阅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;
}
}