来自同一枚举的动态JComboBox

时间:2012-07-18 09:37:49

标签: java swing enums jcombobox

我正在尝试为LARP游戏设置角色经理。在游戏中,角色可以有多个角色(1或2)。我想使用两个组合框来生成角色,两个组合框都来自同一个名为enum的{​​{1}}。这本身很容易:

Role

除非我们的角色是: JComboBox roleFirstComboBox = new JComboBox(IPlayerCharacter.Role.values()); JComboBox roleSeondComboBox = new JComboBox(IPlayerCharacter.Role.values()); ,否则您可以成为Coder, Programmer, SysAdmin, Nerdfighter。所以第二个框需要排除第一个框中选择的内容。

我有一个想法是创建一个函数将枚举传递给某种类型的List然后当选择一个JComboBox时,它使用一个标准容器方法来查找异步联合(?)Box2中的所有内容在Box1中。这看起来很可怕。我知道解决方案使用的是JComboBoxModel,但我不知道如何使其适应我的枚举。

获得此类功能的最佳方法是什么?

编辑:

这是我目前正在使用的代码,它只存在于我的窗格中,因此我认为它不再需要上下文。如果需要,请让我知道。

创建组合框

Coder/Coder

添加actionListener:

JComboBox roleFirstComboBox = null;
JComboBox roleSecondComboBox = null;
...
roleFirstComboBox = new JComboBox(IPlayerCharacter.Role.values());
roleSecondComboBox = new JComboBox(IPlayerCharacter.Role.values());

将其添加到groupLayout:

roleFirstComboBox.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        roleSecondComboBox.removeAll();
        roleSecondComboBox.addItem(null);
        for (Role role : IPlayerCharacter.Role.values()) {
            if (role != roleFirstComboBox.getSelectedItem()) {
                    roleSecondComboBox.addItem(role);
            } 
        }
    }
});
roleFirstComboBox.setSelectedIndex(0);

最后的样子和bug:

enter image description here

这有帮助吗?

2 个答案:

答案 0 :(得分:1)

将ActionListener添加到第一个组合框。触发操作后,将第二个组合框上的模型重置为完整的角色列表,然后使用removeItem(Object)从第二个框中删除已选择的角色。或者,清空模型并重新添加除选定项目之外的所有项目:

private enum Roles {CODER, MANAGER, USER}

JComboBox box1 = new JComboBox(Roles.values());
JComboBox box2 = new JComboBox();
public RoleSelection() {
    box1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            box2.removeAllItems();
            box2.addItem(null); // For those with only one role
            for (Roles role : Roles.values()) {
                if (role != box1.getSelectedItem()) {
                    box2.addItem(role);
                }
            }
        }
    });
    // Trigger a selection even to update the second box
    box1.setSelectedIndex(0);

    add(box1, BorderLayout.NORTH);
    add(box2, BorderLayout.SOUTH);
    pack();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    new RoleSelection().setVisible(true);
}

答案 1 :(得分:1)

您可以为每个组使用EnumSet以使它们分开。

修改:在您的enum中,您可以为每个群组制作一个Set

Set<Resolution> peon = EnumSet.of(Role.Coder, Role.Programmer);

然后你可以用它们制作模型,

for (Role r : Role.peon) {
    System.out.println(r.toString());
}

然后根据需要更改模型。