1

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

    JComboBox roleFirstComboBox = new JComboBox(IPlayerCharacter.Role.values());
    JComboBox roleSeondComboBox = new JComboBox(IPlayerCharacter.Role.values());

除非说我们的角色是:Coder, Programmer, SysAdmin, Nerdfighter您可以成为Coder/Coder. 所以第二个框需要排除在第一个框中选择的任何内容。

One thought I had was making a function to pass the enums to a List of some sort and then when one JComboBox is picked, it uses one of the standard container methods to find the asynchronous union(?) everything in Box2 that isn't in框 1。这看起来很可怕。我知道该解决方案使用JComboBoxModel,但我不知道如何使其适应我的枚举。

获得这种功能的最佳方法是什么?

编辑:

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

创建组合框

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

添加一个动作监听器:

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);

将其添加到 groupLayout:

.addComponent(roleFirstComboBox)
.addComponent(roleSecondComboBox))

最后的外观和错误:

在此处输入图像描述

这有帮助吗?

4

2 回答 2

1

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

编辑:在您的enum中,您可以Set像这样为每个组创建一个,

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

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

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

然后根据需要更改模型。

于 2012-07-18T14:21:02.517 回答
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);
}
于 2012-07-18T11:31:40.060 回答