Java:使用一组Enum值作为SpinnerListModel



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

一些背景:我自己承担了为《Savage Worlds》RPG系统编写一种"RPG角色生成器"的任务。我正在使用NetBeans IDE为这个应用程序设计一个UI。到目前为止,一切都很顺利,但是我现在遇到了一个我似乎无法解决的错误。

我有一组属性:敏捷,力量,智慧,精神和活力。这些属性的值是die类型,即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,以便能够调整每个属性的值。我想在旋转器中使用这些die类型,所以我为它们初始化了一个新的SpinnerListModel:

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

到目前为止,一切都很好,一切都运行正常,我可以运行应用程序,窗口出现了为每个旋转器填充的Enum列表。(计划将模型初始化移动到一个变量,我可以插入到每个单独的旋转器,但现在我正在使用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)

…源自于尝试设置值。

我做错了什么?我需要以不同的方式创建列表模型吗?在我试图赋值的方式有语法错误吗?

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

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

这应该可以工作。在NetBeans中,它会自动创建ComboBox,因此您需要右键单击并单击"自定义代码",并像上面一样进行必要的更改。

对我来说,这个问题的答案是相当复杂的。我没有正确初始化我想要的角色属性的默认值。一旦我解决了这个问题,错误就不再发生了,并且旋转器中的值被正确地分配和显示。

对于那些可能不熟悉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()返回"d4",因为这是通过实例化旋转器分配的值,而不是从我尝试的赋值。

这是我的一个新手错误,但希望我的错误能帮助到其他可能遇到这个问题的人。感谢所有花时间阅读和回答这篇文章的人

相关内容

  • 没有找到相关文章

最新更新