1

LARPゲームのキャラクターマネージャーを設定しようとしています。ゲームでは、キャラクターは複数の役割(1または2)を持つことができます。2つのコンボボックスを使用してキャラクターを生成したいと思います。どちらも同じ名前の。から描画しenumますRole。それ自体は簡単です。

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

私たちの役割が次のとおりであると言う場合を除いて:Coder, Programmer, SysAdmin, NerdfighterあなたはになることができますCoder/Coder。したがって、2番目のボックスは、最初のボックスで選択されているものをすべて除外する必要があります。

私が持っていた考えの1つは、列挙型をある種のリストに渡す関数を作成し、1つのJComboBoxが選択されると、標準のコンテナーメソッドの1つを使用して、Box2にないすべての非同期ユニオン(?)を検索することでした。ボックス1。これは恐ろしいようです。ソリューションがJComboBoxModelを使用していることは知っていますが、これを列挙型に適応させる方法はわかりません。

この種の機能を取得するための最良の方法は何ですか?

編集:

これが私が現在使用しているコードです。それは私のペイン内にあるだけなので、もうコンテキストは必要ないと思います。必要に応じて、別の方法でお知らせください。

コンボボックスの作成

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

actionListenerの追加:

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

ActionListenerを最初のコンボボックスに追加します。アクションがトリガーされたら、2番目のコンボボックスのモデルを役割の完全なリストにリセットしてから、を使用removeItem(Object)して、2番目のボックスから既に選択されている役割を削除します。または、モデルを空にして、選択したアイテムを除くすべてのアイテムを再度追加します。

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 に答える
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 に答える