【问题标题】:Creating a DefauitComboBoxModel class创建一个 DefauitComboBoxModel 类
【发布时间】:2016-11-11 16:21:43
【问题描述】:

我需要创建一堆相同的 JComboBox。我正在尝试使用 DefaultComboBoxModel 来生成模型。但是,我还需要根据要包含在列表中的数据创建几个不同的模型。因此,我创建了一个我想用来生成模型的类。

public class ModelComboBox<T> {

    public ModelComboBox(ArrayList<String> list_) {
        DefaultComboBoxModel<String> model=new DefaultComboBoxModel<String>();
        for (String entry : list_) {
            model.addElement(entry);
        }
    }
}

当我尝试使用模型时,我得到一个 ModelComboBox.ModelComboBox 无法解析为类型错误。

meatNames=new JComboBox<String>(new ModelComboBox.ModelComboBox<String>(meats));

谁能帮助我告诉它 ModelComboBox.ModelComboBox 的类型是什么的语法?我在参数中尝试了 (DefaultComboBoxModel) 的各种位置,但我没有尝试过。 TIA。

【问题讨论】:

    标签: java class types


    【解决方案1】:

    这里有很多问题。

    首先,ModelComboBox 是一个顶级类。与任何其他顶级类一样,调用其构造函数的语法是 new ModelComboBox&lt;String&gt;(),而不是 new ModelComboBox.ModelComboBox&lt;String&gt;()

    其次,这个类是一个泛型类,但它不会在任何地方使用它的泛型类型(T)。所以它绝对没有理由是通用的。

    第三,它的构造函数创建一个 DefaultComboBoxModel,并将其分配给一个局部变量。当构造函数完成时,DefaultComboBoxModel 将超出范围,符合 GC 条件,因此无法在任何地方使用。

    最后,您将 ModelComboBox 的一个实例传递给 JComboBox 的构造函数。但是 JComboBox 需要一个 ComboBoxModel 实例,而不是 ModelComboBox 实例。所以无法编译。

    IMO,你完全想多了。您所需要的只是一些允许获取List&lt;String&gt; 并从该列表中创建 DefaultComboBoxModel 的辅助方法:

    public DefaultComboBoxModel<String> createComboBoxModel(List<String> list) {
        return new DefaultComboBoxModel<String>(new Vector<>(list));
    }
    

    【讨论】:

    • 嗯,这当然要容易得多。但是,当我创建您的辅助方法时,我收到此错误: DefaultComboBoxModel 是原始类型。对泛型类型 DefaultComboBoxModel 的引用应该被参数化
    • 更正,这是警告而不是错误。我可以忽略它,但有没有办法摆脱它?感谢您让我走上正轨。
    【解决方案2】:

    JB Nizet 的解释很好,但我会稍微修改一下。

    public ModelComboBox(ArrayList<String> list) {
        setModel(new DefaultComboBoxModel<String>(list.toArray());
    }
    

    无需创建VectorArrayList 实现了 List 接口,它保证了 .toArray() 方法。

    所有支持模型的 Swing 组件都有一个 setModel(...) 函数,它采用 Component 支持的模型类型。

    【讨论】:

    • 那不会编译。 toArray() 返回一个 Object[],但构造函数需要一个 String[]。您需要使用list.toArray(new String[list.size()])
    • @JBNizet 我从记忆中输入了很多次,所以不,我没有通过编译器运行它。我也相信你可以使用 list.toArray()。但是
    • 那不是有效的 Java,而且 toArray() 也不是泛型方法。
    • 你是对的 toArray() 不是通用的,你的例子是最好的。
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多