Java:使用一组枚举值作为SpinnerListModel

时间:2014-05-05 18:49:32

标签: java netbeans enums jspinner

如果有人在其他地方询问过,我会提前道歉,但我已经环顾四周,似乎无法找到适合我情况的答案。

一些背景:我自己为Savage Worlds RPG系统编写了一种“角色扮演角色建设者”。我正在使用NetBeans IDE为此应用程序设计UI。到目前为止,事情进展顺利,但我现在遇到了一个我似乎无法弄清楚的错误。

我有一套属性:敏捷,力量,智慧,精神和活力。这些属性的值是D​​ie-type,即d4,d6 ... d12。我创建了一个Enum来表示这些模具类型:

public enum DieType {

    D4(4), D6(6), D8(8), D10(10), D12(12);

    private int face;

    private DieType(int face) {
        this.face = face;
    }

    public int getValue() {
        return face;
    }

    @Override
    public String toString() {
        String dieType = "d" + face;
        return dieType;
    }

}

在我的UI中,我创建了一系列JSpinner,以便能够调整每个属性的值。我想在微调器中使用这些骰子类型,所以我为它们初始化了一个新的SpinnerListModel:

agiSpin.setModel(new SpinnerListModel(DieType.values()));

到目前为止,非常好,一切都运行良好,我可以运行应用程序,窗口显示为每个微调器填充的枚举列表。 (计划将模型初始化移动到我可以插入每个微调器的变量,但是现在我正在使用NetBeans生成的代码,所以我分别创建了每个实例。)

当我尝试根据我的SWCharacter类的实例初始化每个微调器的值时出现问题,在绘制GUI之前进行实例化。对于上面的agiSpin微调器,我这样做:agiSpin.setValue(swchar.getAgiAttr());以便分配适当的值。变量agiAttrDieType枚举的实例。当我运行程序时,我得到:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: invalid sequence element
at javax.swing.SpinnerListModel.setValue(SpinnerListModel.java:185)
at javax.swing.JSpinner.setValue(JSpinner.java:356)

...源于设置值的尝试。

我做错了什么?我是否需要以不同的方式创建列表模型?我尝试分配值的方式是否存在语法错误?

2 个答案:

答案 0 :(得分:1)

Spinner通常用于用户输入的整数或双精度值。在这种情况下,我会使用一个ComboBox,其中每个值都被初始化。创建JComboBox的代码是:

    JComboBox die = new JComboBox<DieType>(DieType.values());

这应该有效。在NetBeans中,它会自动创建ComboBox,因此您需要右键单击并单击“自定义代码”并进行必要的更改,如上所述。

答案 1 :(得分:0)

我的问题的答案对我来说几乎是一个缺点。我没有正确初始化我想要的字符属性的默认值。一旦我修复了它,就不再出现错误,并且旋转器中的值被正确分配和显示。

对于那些可能更新的Java和/或GUI设计的人......

在初始化抛出异常的微调器之前,我为这两个值添加了System.out.println();

agiSpin.setModel(new SpinnerListModel(DieType.values()));
//Check to see what value was being passed from the swchar Object
System.out.println(swchar.getAgiAttr()); 

//I wanted to see what the actual value was that was assigned to the Spinner when I initialized it with DieType.values()
System.out.println(agiSpin.getValue()); 
agiSpin.setValue(swchar.getAgiAttr());

我原本以为我将变量agiAttr初始化为DieType.D4,但System.out.println()告诉我实话:getAgiAttr()返回的值为null,因此,agiSpin.getValue()正在返回&#34; d4&#34;,因为它是通过实例化微调器而分配的值,而不是我正在尝试的任务。

这对我来说是一个noob错误,但希望我的错误会帮助其他可能发生在这个问题上的人。感谢任何花时间阅读/回答此问题的人。