JCheckBoxのグループ内で選択可能な上限を設定する
Total: 745, Today: 1, Yesterday: 2
Posted by aterai at 
Last-modified: 
Summary
JCheckBoxを同一JPanel、またはJComboBox内に配置されているかでグループ化し、そのグループ内で選択可能なJCheckBoxの数を制限します。
Screenshot

Advertisement
Source Code Examples
class GroupCheckBox extends JCheckBox {
  protected GroupCheckBox(String title) {
    super(title);
  }
  @Override public void updateUI() {
    super.updateUI();
    setModel(new ToggleButtonModel() {
      private static final int GROUP_SIZE = 3;
      @Override public void setSelected(boolean selected) {
        if (selected) {
          if (getSelectedObjects().length == GROUP_SIZE) {
            UIManager.getLookAndFeel()
                .provideErrorFeedback(GroupCheckBox.this);
          } else {
            super.setSelected(true);
          }
        } else {
          super.setSelected(false);
        }
      }
      @Override public Object[] getSelectedObjects() {
        Container parent = getParent();
        return Arrays.stream(parent.getComponents())
            .filter(AbstractButton.class::isInstance)
            .map(AbstractButton.class::cast)
            .filter(AbstractButton::isSelected)
            .toArray();
      }
    });
  }
}
Description
- JPanelでグループ化して選択可能な- JCheckBoxの数を- 3に制限- ToggleButtonModel#getSelectedObjects()をオーバーライドして、親が同じ- JPanelに配置された選択状態の- JCheckBoxの配列を取得
- ToggleButtonModel#setSelected(boolean)をオーバーライドして、選択状態の- JCheckBoxの数が- 3の場合は- super.setSelected(true)を実行せずに選択を取り消す
- ビューであるJCheckBoxのgetSelectedObjects()やsetSelected(boolean)をオーバーライドしても選択の取り消しなどが実行不可なので、モデル側のToggleButtonModelでgetSelectedObjects()やsetSelected(boolean)をオーバーライドし、JCheckBox#setModel(...)で設定している
 
- JComboBoxのドロップダウンリストでグループ化して選択可能な- JCheckBoxの数を- 3に制限- JComboBoxのアイテムとして表示したJCheckBoxを複数選択するのようにドロップダウンリストにJCheckBoxを表示して複数選択可能に設定
- ドロップダウンリストに表示するJCheckBoxは表示用のListCellRendererとして使い回しているため、上記のGroupCheckBoxを使用しても効果がない
- JComboBox#getSelectedObjects()をオーバーライドして、選択状態のリストアイテム配列を取得
- ドロップダウンリストにMouseListenerを追加し、クリック時にJComboBox#getSelectedObjects()で選択状態のリストアイテムを取得し、その数がすでに3の場合はリストアイテムの選択を取り消す
 
- JComboBoxのアイテムとして表示したJCheckBoxを複数選択するのようにドロップダウンリストに
Reference
- ItemListenerからItemSelectableを実装するコンポーネントを取得する
- JComboBoxのアイテムとして表示したJCheckBoxを複数選択する
- java - How can I limit the check box selected? - Stack Overflow
- CheckboxGroup (Java Platform SE 8)
- java.awt.Checkboxをグループ化する- CheckboxGroupが存在するが、選択可能な- Checkboxは- 1つのみになる