【问题标题】:jCombo Box With Hidden Data java带有隐藏数据的 jComboBox java
【发布时间】:2017-02-20 12:22:45
【问题描述】:

我搜索了如何在java中的jComboBox中放入额外的数据,我发现最多的结果是创建一个包含属性键和值的Item Class。

我已经这样做了,但是当我尝试使用 `new Item(key, value) 在 jComboBox 中添加项目时,我仍然遇到此错误,

错误代码是:

项目无法转换为字符串 jComboTemp1.addItem(new Item("CA", "Canada"));

这是类项目:

public class Item {

    private int id;
    private String description;

    public Item(int id, String description) {
        this.id = id;
        this.description = description;
    }

    public int getId() {
        return id;
    }

    public String getDescription() {
        return description;
    }

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

虽然我已经覆盖了 toString 方法,但问题在这里显示:

jComboTemp1.addItem(new Item<String>("CA", "Canada"));

【问题讨论】:

  • 发布一个真实的程序,minimal reproducible example 显示您的问题。您需要将 JComboBox 及其模型更改为 JComboBox&lt;Item&gt;DefaultComboBoxModel&lt;Item&gt; 类型。然后正确显示或者覆盖项目的toString(),或者给组合框一个渲染器。

标签: java swing jcombobox


【解决方案1】:

你有几个问题:

public class Item {

该类不使用泛型。

public Item(int id, String description) {

构造函数需要一个“int”和一个“String”。

jComboTemp1.addItem(new Item<String>("CA", "Canada"));

当你创建 Item 对象时你有两个错误:

  1. 您正在尝试使用泛型
  2. 您传递了错误的参数。

所以你有两个解决方案。您需要:

  1. 正确使用泛型,或者
  2. 不要使用泛型。

如果您不使用泛型,则需要将正确的参数传递给Item 对象:

jComboTemp1.addItem(new Item(1, "Canada"));

如果您确实想使用泛型,则需要修改 Item 类以使用泛型。

查看Combo Box With Hidden Data 中的Item 类以获取通用Item 对象。这个对象是一个更完整的实现,因为它还实现了equals(...)hashcode() 方法。

如果您想在 Item 类中使用 Integer 数据,请使用上述链接中的 Item 类:

JComboBox<Item<Integer>> jcomboTemp1 = new JComboBox<Item<Integer>>();
...
jcomboTemp1.addItem(new Item<Integer>(1, "Canada"));  

使用泛型对象稍微复杂一些,但您可以获得额外的编译时检查安全性,以确保您将正确的数据添加到类中。

泛型类更可重用。您可以轻松地将代码更改为:

JComboBox<Item<String>> jcomboTemp1 = new JComboBox<Item<String>>();
...
jcomboTemp1.addItem(new Item<String>("CA", "Canada"));  

现在该类支持字符串格式的隐藏值,并且无需更改 Item 类。

【讨论】:

    【解决方案2】:

    改为:

    jComboTemp1.addItem(new Item<String>("CA", "Canada"));
    

    使用:

    jComboTemp1.addItem("CA");
    jComboTemp1.addItem("Canada");
    

    或者

    jComboTemp1.addItem(new Item(1, "CA"));
    jComboTemp1.addItem(new Item(2, "Canada"));
    

    你有一个构造函数 Item(int, String) 而不是 Item(String)

    【讨论】:

      【解决方案3】:

      您在这里没有提供足够的代码:

      你在这里使用什么Item类:

      jComboTemp1.addItem(new Item<String>("CA", "Canada"));
      

      您实例化了一个泛型类,但您的 Item 类不是泛型类

      以下代码适用于我

      class Item {
          private final int id;
          private final String name;
          public Item(int id, String name) {
              super();
              this.id = id;
              this.name = name;
          }
          public int getId() {
              return id;
          }
          public String getName() {
              return name;
          }
          @Override
          public String toString() {
              return getName();
          }
       }
      
      
      JComboBox<Item> combobox = new JComboBox<Item>();       
      combobox.addItem(new Item(4711, "name1"));
      combobox.addItem(new Item(4712, "name2"));
      combobox.addItem(new Item(4713, "name3"));
      

      【讨论】:

      • 我只创建了一个小例子,但我会更正我的答案
      • “我会更正我的答案” 我不认为你的答案是“错误的”。这里的问题是问题需要澄清,因为问题的某些部分中的 OP 暗示这两条信息是一个国家名称和一个国家名称的字符串缩写,而问题的其他部分暗示这两条信息是一个基于整数和字符串的国家名称。也许他们需要扩展Item 以合并一个整数& 2 个字符串,但最终,他们需要决定(并告诉我们)@987654324 到底是什么@ 需要包含。
      猜你喜欢
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多