【问题标题】:How to display custom objects (with toString) in a JComboBox如何在 JComboBox 中显示自定义对象(使用 toString)
【发布时间】:2017-10-19 10:55:35
【问题描述】:

我对 Java 比较陌生,所以请记住这一点...

我有一个swing GUI,其中包含一个JComboBox。 我希望用户选择ArrayList<Person> 中的一个选项。 请注意,我也可以使用数组。 我以前用过 JComboBox,但只用过字符串。 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>

我需要类似的东西吗?

这可能吗?

一些例子:

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

【问题讨论】:

  • 鉴于DefaultComboBoxModel constructors 接受a)没有参数b)一个数组(即[])或c)一个Vector - 你为什么要尝试使用ArrayList 构造一个? “但是 setModel 方法不需要这些。” 总是复制/粘贴错误和异常输出!听起来好像您正在尝试“魔术编程”,但这永远行不通。尝试理解编译器或运行时提供的消息。查看 API 文档以了解所使用的方法和构造函数。
  • @AndrewThompson 对不起,我忘了提。我已经进行了编辑。感谢您的评论。我没有得到异常,它不会编译(就像我预期的那样)。不过,谢谢您的评论。
  • “我所有的代码都在 GutHub 上” 很少有人会关注外部链接,很少有人会在完整的代码库中寻找问题。将minimal reproducible example 此处 作为edit 发布到问题中。编辑不包括复制/粘贴的编译器错误消息。

标签: java swing jcombobox


【解决方案1】:

再次:我希望 ArrayList 可以在 JComboBox 中选择其 Person 对象

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

所以你需要将 ArrayList 中的数据添加到模型中。

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

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

【讨论】:

    【解决方案2】:

    我知道我迟到了,但这是您正在寻找的答案:

    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;
    }
    

    【讨论】:

    • 感谢您的回复。为什么我需要HashSet?它是必需的,还是任何集合(例如ArrayList)都可以工作?
    • HashSet 只是一个集合,用于确保集合中只有唯一的项目。请注意,我使用 .toArray 将其转换为 Combobox 模型所需的数组。
    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多