0

JFrameあり、そのフレームにはいくつかのJCheckBoxコンポーネントがあります。5 つのチェック ボックスのセットが 2 つあるとします。

たとえば、最初のセットの最初のチェック ボックスをオンにすると、他の 4 つのチェック ボックスが無効になります。しかし、他の「セット」のものではありません。

問題は、多くの if ステートメントを書かないとこれを行う方法がわからないことです。実際には約26個のチェックボックスがあるからです。15本1セット、11本1セット。

どのチェックボックスがチェックされているかを把握し、それらすべてを無効にするのが賢明だと思いますが、もちろんチェックされたものは無効にします。しかし、どのチェックボックスが設定されているかを確認する方法がわかりません。特定のボックスのみを確認できます。例えば

 @Override
public void itemStateChanged(ItemEvent e) {
    if(e.getSource.equals(CheckBox_1){
        //dostuff
    }
}
4

3 に答える 3

5

独自のコントローラーを作成して、1 つのセット内のすべてのボタンを一緒に関連付けることができます。

ButtonSetController controller = ButtonSetController(
   checkBox1,
   checkBox2,
   checkBox3,
   checkBox4,
   checkBox5);

コントローラはActionListener各ボタンに を追加し、そこの状態の変化を監視します。適切な状態変化が発生すると、コントローラーはセット内の他のすべてのボタンを自動的に無効にすることができます...

public void actionPerformed(ActionEvent evt) {
    JCheckBox btn = (JCheckBox)evt.getSource();
    if (btn.isSelected()) {
        for (JCheckBox cb : buttons) {
            if (cb != btn) {
                cb.setSelected(false);
                cb.setEnabled(false);
            }
        }
    } // Consider re-enabling all the buttons...?
}

さて、ボタンの配列も使用すると、これはすべて簡単になります...

ボタンを追加することも検討できますButtonGroup。これにより、一度に 1 つのボタンだけが選択されるようになります。

詳細については、ButtonGroup コンポーネントの使用方法を参照してください。

大まかな例として

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ButtonControllerExample {

    public static void main(String[] args) {
        new ButtonControllerExample();
    }

    public ButtonControllerExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JCheckBox[] buttons = new JCheckBox[8];
                buttons[0] = new JCheckBox("Bananas");
                buttons[1] = new JCheckBox("Grapes");
                buttons[2] = new JCheckBox("Apples");
                buttons[3] = new JCheckBox("Pears");
                buttons[4] = new JCheckBox("Kikiw");
                buttons[5] = new JCheckBox("Potatos");
                buttons[6] = new JCheckBox("Tomatoes");
                buttons[7] = new JCheckBox("Tim Tams");

                ButtonController<JCheckBox> controller = new ButtonController<>(4, buttons);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                for (JCheckBox cb : buttons) {
                    frame.add(cb);
                }

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ButtonController<T extends JToggleButton> {

        private List<T> selected;
        private int limit;

        public ButtonController(int limit, T... buttons) {
            if (limit <= 0) {
                throw new IllegalArgumentException("Limit can not be equal to or less then 0");
            }
            this.limit = limit;
            selected = new ArrayList<>(limit + 1);
            ItemStateHandler handler = new ItemStateHandler();
            for (T btn : buttons) {
                btn.addItemListener(handler);
            }
        }

        public class ItemStateHandler implements ItemListener {

            @Override
            public void itemStateChanged(ItemEvent e) {
                T btn = (T)e.getSource();
                if (!selected.contains(btn) && btn.isSelected()) {
                    selected.add(btn);
                    while (!selected.isEmpty() && selected.size() > limit) {
                        btn = selected.remove(0);
                        btn.setSelected(false);
                    }
                } else {
                    selected.remove(btn);
                }
            }

        }

    }

}
于 2014-07-02T01:59:01.017 に答える
1
ArrayList<JCheckBox> relatedBoxes = new ArrayList<>();
... add related boxes to your list
@Override
public void itemStateChanged(ItemEvent e) {
    JCheckBox selected = (JCheckBox) e.getSource();
    for (JCheckBox box : relatedBoxes) {
        if (!box.equals(selected)){
           box.setEnabled(false);        
           box.setSelected(false);
        }
    }
}

更新:あなたのコメントに応えて、いくつかの機能を独自のList実装に抽象化することが適切である可能性がある領域に入りました。そうは言っても、次のような効果のあるものは、手っ取り早い解決策として機能します。

ArrayList<JCheckBox> relatedBoxes = new ArrayList<>();  //consder creating class CheckBoxList extends ArrayList<JCheckBox> {}
... add related boxes to your list

@Override
public void itemStateChanged(ItemEvent e) {
    int numSelected = 0; 
    for(JCheckBox box : relatedBoxes) 
        if (box.isSelected()) numSelected++; //would be nice if you could call: if (checkBoxList.numSelected >= 6)
    if (numSelected >= 6) {
        JCheckBox selected = (JCheckBox) e.getSource();
        for (JCheckBox box : relatedBoxes) {
            if (!box.equals(selected)){
               box.setEnabled(false);        
               box.setSelected(false);
            }
        }
    } else //do something (or nothing) when less than 6 are selected
}
于 2014-07-02T02:01:49.003 に答える
-1

このチュートリアルを参照してください

こんにちは、CheckBoxGroupこの形式のようなクラスを使用して、チェックボックスをグループ化できます。

CheckboxGroup fruitGroup = new CheckboxGroup();

      Checkbox chkApple = new Checkbox("Apple",fruitGroup,true);
      Checkbox chkMango = new Checkbox("Mango",fruitGroup,false);
      Checkbox chkPeer = new Checkbox("Peer",fruitGroup,false);
于 2014-07-02T01:56:13.900 に答える