如何在JComboBox中显示自定义对象(使用toString)

时间:2017-05-19 10:37:26

标签: java swing jcombobox

我对Java很新,所以请记住这一点......

我有一个swing GUI,其中包含JComboBox。 我希望用户选择ArrayList<Person>的一个选项。 请注意我也可以使用数组。 我之前使用过JComboBox。但只有Strings。 Person类有一个toString()方法,我想用它来获取应该代表JComboBox中对象的文本。

当稍后推送JButton时,应将选定的Person对象(相同的对象)添加到另一个ArrayList以进行进一步操作。

我希望按钮能够执行以下操作:

Person selectedPerson = (Person) myComboBox.getselectedItem();

然而,我不知何故需要以某种方式将那些Person对象放入该东西中。 我试着用:

myComboBox.setModel(new DefaultComboBoxModel<>(aListOfStuff);

我甚至尝试制作自己的模型:

public class DropDownModel extends DefaultComboBoxModel<Person> implementsMutableComboBoxModel<Person>

但是setModel方法不需要这些。

我在Stackoverflow上看过其他类似的问题,但没有一个回答我的问题。我也注意到有人提到渲染类或类似的东西。

再次: 我希望ArrayList能够在JComboBox中选择其Person对象,以便我可以使用Person tempPerson = (Person) myComboBox.getSelectedObject();访问所选的对象。

我是否必须制作自己的模型类?

我在JList中显示它们。使用自定义模型

public class ListBoxModel extends AbstractListModel<Person> implements Iterable<Person>

我需要类似的东西吗?

这有可能吗?

顺便说一句:我的所有代码都在GutHub上(如果你有太多时间并想看看):https://github.com/Bernd-L/PersonenManager2/tree/Teacher-selection

一些例子:

myComboBox.setModel(new DefaultComboBoxModel<>(s.getPersonListAsArray()));
cbRemoveClass.setModel(new DefaultComboBoxModel<>(t.getClasses().toArray(new String[t.getClasses().size()])));
someOtherComboBox.setModel(new DropDownModel(dlModel.getList())); // trying to use my custom model

2 个答案:

答案 0 :(得分:1)

  

再次:我希望ArrayList在JComboBox

中选择其Person对象

这不是它的工作原理。 ArrayList对组合框没有任何意义。数据需要存储在ComboBoxModel

因此,您需要将ArrayList中的数据添加到模型中。

您编写了一个简单的循环来迭代ArrayList,然后使用组合框便捷方法将项添加到模型中:

for (each item in the ArrayList)
    comboBox.addItem( theItem );

答案 1 :(得分:0)

我知道我来晚了,但这就是你想要的答案:

JComboBox<ProtocolInterface> protocolCombo = new javax.swing.JComboBox<>();
HashSet<ProtocolInterface> protocols=this.myDevice.getSupportedProtocols();
protocolCombo.setModel(new javax.swing.DefaultComboBoxModel<ProtocolInterface>(protocols.toArray(new ProtocolInterface[protocols.size()])));

只需确保您的对象(在本例中为ProtocolInterface)具有一个“ toString”方法来显示所需的文本,即可:

@Override
public String toString() {
    return name;
}