我想将对象添加到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执行此类操作?
答案 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。