有没有办法将对象添加到JComboBox并分配要显示的字符串?

时间:2013-11-22 21:49:47

标签: java swing combobox jcombobox

我想将对象添加到JComboBox,但是在JComboBox上为每个对象显示一个String。

例如,在以下html代码中

<select>
  <option value="1">Item 1</option>
  <option value="2">Item 2</option>
  <option value="3">Item 3</option>
  <option value="4">Item 4</option>
</select>

在第一项中,显示的字符串是&#34;项目1&#34;,但项目的值是&#34; 1&#34;。

是否有表格可以使用JComboBox执行此类操作?

4 个答案:

答案 0 :(得分:2)

首先查看How to Use Combo Boxes,特别是Providing a Custom Renderer

基本上,你想要定义你的对象,它将包含在组合框中......

public class MyObject {
    private String name;
    private int value;

    public MyObject(String name, int value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public int getValue() {
        return value;
    }
}

然后创建一个知道如何渲染它的自定义ListCellRenderer ...

public class MyObjectListCellRenderer extends DefaultListCellRenderer {

    public Component getListCellRendererComponent(
                                   JList list,
                                   Object value,
                                   int index,
                                   boolean isSelected,
                                   boolean cellHasFocus) {
        if (value instanceof MyObject) {
            value = ((MyObject)value).getName();
        }
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        return this;
    }
}

然后填充组合框并应用单元格渲染器......

JComboBox box = new JComboBox();
box.addItem(new MyObject(..., ...));
//...
box.setRenderer(new MyObjectListCellRenderer());

同样,您可以覆盖对象的toString方法,但我倾向于为了显示目的而避免这种情况,因为我喜欢toString方法来提供有关对象的诊断信息,但那就是我

答案 1 :(得分:1)

如果组合框模型包含对象,则默认情况下将使用其toString()方法在组合框中显示它们。如果toString()方法显示您想要的内容,则无需执行任何操作。

否则,您只需要设置一个单元格渲染器来自定义每个对象的显示方式(这不会限制您使用文本:您还可以更改字体,颜色,图标等。)

这一点在Swing tutorial

中有所描述

答案 2 :(得分:0)

是的,可以使用对象类型作为JComboBox泛型的参数来完成,如下所示:

public class TestFrame extends JFrame {
    // This will be the JComboBox's item class
    private static class Test {
        private Integer value;
        private String label;

        public Test(Integer value, String label) {
            this.setValue(value);
            this.setLabel(label);
        }

        public Integer getValue() {
            return value;
        }

        public void setValue(Integer value) {
            this.value = value;
        }

        public String getLabel() {
            return label;
        }

        public void setLabel(String label) {
            this.label = label;
        }

        // The "toString" method will be used by the JComboBox to generate the label for the item
        @Override
        public String toString() {
            return getLabel();
        }        
    }

    public static void main(String[] args) {
        TestFrame frmMain = new TestFrame();
        frmMain.setSize(300, 50);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Here you declare a JComboBox that 
        // uses the type "Test" for item elements 
        JComboBox<Test> cmbCombo = new JComboBox<TestFrame.Test>();

        for (int i = 0; i < 10; i++) {
            // Add some elements for the combo 
            cmbCombo.addItem(new Test(i, String.format("This is the item %d", i + 1)));
        }

        // Listen to changes in the selection
        cmbCombo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JComboBox<Test> cmbCombo = (JComboBox<Test>) e.getSource();

                // The selected element is a "Test" instance, just cast it to the correct type
                Test test = (Test) cmbCombo.getSelectedItem();

                // Manipulate the selected object at will
                System.out.printf("The selected value is '%d'\n", test.getValue());
            }
        });

        frmMain.add(cmbCombo);
        frmMain.setVisible(true);
    }
}

答案 3 :(得分:0)

  

例如,在以下html代码中

对于像这样简单的东西,你有一个“ID”,“值”类型的数据,我喜欢自定义对象的方法,他们的目的是提供一个自定义toString()方法。有关此类可重用对象,请参阅Combo Box With Hidden Data

论坛中的很多人都推荐自定义渲染器。不幸的是,使用自定义渲染器会破坏comobo框的默认功能。有关详细信息,请参阅Combo Box With Custom Renderer