我正在尝试为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
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);
这有帮助吗?
答案 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());
}
然后根据需要更改模型。