JComboBox设置标签和值

xde*_*000 14 java swing jcombobox

是否可以设置一个值和一个标签,JComboBox以便我可以显示一个标签,但得到一个不同的值?

例如在JavaScript中,我可以这样做:

document.getElementById("myselect").options[0].value //accesses value attribute of 1st option
document.getElementById("myselect").options[0].text //accesses text of 1st option
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 28

您可以将任何对象放在JComboBox中.默认情况下,它使用对象的toString方法在组合框中使用键盘显示标签导航.因此,最好的方法是在组合中定义和使用适当的对象:

public class ComboItem {
    private String value;
    private String label;

    public ComboItem(String value, String label) {
        this.value = value;
        this.label = label;
    }

    public String getValue() {
        return this.value;
    }

    public String getLabel() {
        return this.label;
    }

    @Override
    public String toString() {
        return label;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ xdevel2000只需创建这些对象的aray并将其设置为组合框ComboItem [] items = new ComboItem [] {new ComboItem("value1","label1"),new ComboItem("value2","label2")}; JComboBox cb = new JComboBox(items); (2认同)
  • @kleopatra:那么当一个对象的toString是"foo"时你怎么做,并且你想让它在组合中显示"bar"?使用渲染器工作.但是如果你在组合中击中B,它就不会选择任何东西.如果你在组合中点击F,它会选择呈现为"bar"的项目.这是不可接受的.这就是为什么我建议使用具有足够toString方法的包装器对象. (2认同)

MB.*_*MB. 8

这是一个实用程序界面和类,可以让组合框轻松使用不同的标签.这不是创建替换ListCellRenderer(并且如果外观改变而冒着看起来冒险的风险ListCellRenderer),而是使用默认值(无论可能是什么),而是将自己的字符串作为标签文本而不是由toString()在你的价值对象.

public interface ToString {
    public String toString(Object object);
}

public final class ToStringListCellRenderer implements ListCellRenderer {
    private final ListCellRenderer originalRenderer;
    private final ToString toString;

    public ToStringListCellRenderer(final ListCellRenderer originalRenderer,
            final ToString toString) {
        this.originalRenderer = originalRenderer;
        this.toString = toString;
    }

    public Component getListCellRendererComponent(final JList list,
            final Object value, final int index, final boolean isSelected,
            final boolean cellHasFocus) {
        return originalRenderer.getListCellRendererComponent(list,
            toString.toString(value), index, isSelected, cellHasFocus);
    }

}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的ToStringListCellRenderer,从ToString实现中获取自定义字符串,然后将其传递给原始字符串,而ListCellRenderer不是传递值对象本身.

要使用此代码,请执行以下操作:

// Create your combo box as normal, passing in the array of values.
final JComboBox combo = new JComboBox(values);
final ToString toString = new ToString() {
    public String toString(final Object object) {
        final YourValue value = (YourValue) object;
        // Of course you'd make your own label text below.
        return "custom label text " + value.toString();
    }
};
combo.setRenderer(new ToStringListCellRenderer(
        combo.getRenderer(), toString)));
Run Code Online (Sandbox Code Playgroud)

除了使用它来制作自定义标签之外,如果您创建一个ToString基于系统区域设置创建字符串的实现,您可以轻松地对组合框进行国际化,而无需更改值对象中的任何内容.


tra*_*god 6

拜托,能给我看一个完整的例子吗?

实例Enum对此特别方便,因为toString()"返回此枚举常量的名称,如声明中所包含的那样".

在此输入图像描述

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/5661556 */
public class ColorCombo extends JPanel {

    private Hue hue = Hue.values()[0];

    public ColorCombo() {
        this.setPreferredSize(new Dimension(320, 240));
        this.setBackground(hue.getColor());
        final JComboBox colorBox = new JComboBox();
        for (Hue h : Hue.values()) {
            colorBox.addItem(h);
        }
        colorBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Hue h = (Hue) colorBox.getSelectedItem();
                ColorCombo.this.setBackground(h.getColor());
            }
        });
        this.add(colorBox);
    }

    private enum Hue {

        Cyan(Color.cyan), Magenta(Color.magenta), Yellow(Color.yellow),
        Red(Color.red), Green(Color.green), Blue(Color.blue);

        private final Color color;

        private Hue(Color color) {
            this.color = color;
        }

        public Color getColor() {
            return color;
        }
    }

    private static void display() {
        JFrame f = new JFrame("Color");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new ColorCombo());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


Har*_*Joy 1

使用ListCellRenderer来实现你想要的。创建一个扩展JLabel并实现ListCellRenderer. JComboBox在您的using方法中将该类设置为渲染器setRenderer()。现在,当您从 jcombobox 访问值时,它将是 jlabel 类型。