Java:将EnumSet转换为原始数组E [](用法:JComboBox DefaultComboBoxModel)

时间:2017-10-03 16:30:18

标签: java swing collections enums set

我有几个JComboBox,其中一些值与previus选择有关。

我的所有jComboBox都是这样输入的:

JComboBox<E> comboBox

我可以使用一种完美运行的方法创建一个不错的DefaultComboBoxModel

public static <E extends Enum<E> & MyEnumInterface> JComboBox<E> createCompleteJComboBox( final Class<E> clazz, boolean startsDisabled) 
    {
        JComboBox<E> comboBox = new JComboBox<>();
        comboBox.setModel(new DefaultComboBoxModel<>(clazz.getEnumConstants()));
        comboBox.insertItemAt(null, 0);
        comboBox.setSelectedIndex(0);
        comboBox.setEditable(false);
        comboBox.setEnabled(!startsDisabled);
        return comboBox;
    }

然后我有一些JComboBox我想在以前创建的EnumSet中只填充少量枚举,如下所示:

public static <E extends Enum<E> & MyEnumInterface> void applyCustomValueList2(JComboBox<E> comboBox, final Set<E> allowedValues)
    {

//      List<E> llist = new ArrayList<E>(allowedValues.size());

        boolean hasAnyValue = allowedValues == null ? false : true;
        int size = hasAnyValue ? (allowedValues.size() + 1) : 1;

        if (hasAnyValue)
        {
            List<E> sl = new ArrayList<>(allowedValues);
            E[] enumComboItems = (E[]) allowedValues.toArray();
            comboBox.setModel(new DefaultComboBoxModel<>(enumComboItems));

        }


        comboBox.setEnabled(hasAnyValue);
    }

但我无法在原始E []中转换EnumSet allowedValues。

<小时/> 编辑: 错误我得到

09:32:01:625 [ERROR] ( AWT-EventQueue-0) (XXXController.java:208) - uncaught exception in thread AWT-EventQueue-0:[Ljava.lang.Object; cannot be cast to [Ljava.lang.Enum;
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Enum;
    at xyz.xzad.asdasd.asdasd.ComboCreator.applyCustomValueList2(ComboCreator.java:74)
    at xyz.xzad.asdasd.asdasd..Panel$MyItemChangeListner.itemStateChanged(PanelSettingsAnagraphics.java:975)
    at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1225)

尝试使用上一个示例,经过CollectionsArrays.asList,但我做错了。

有什么想法吗?

我宁愿不在DefaultComboBoxModel中使用任何包装类。

谢谢你的建议

1 个答案:

答案 0 :(得分:2)

new E[]

暗示

        E[] enumComboItems = (E[]) allowedValues.toArray();

因为类型擦除会产生Object[]

逐个添加项目,或者复古:

        Vector<E> enumComboItems = new Vector<>(allowedValues);
        comboBox.setModel(new DefaultComboBoxModel<>(enumComboItems));

这也可以通过将enum类保持为运行时字段,构造函数的参数来解决。