Swing/LimitNumberOfCheckBoxSelections のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/LimitNumberOfCheckBoxSelections へ行く。
- 1 (2024-09-02 (月) 00:07:28)
- 2 (2024-09-05 (木) 13:27:46)
- 3 (2024-09-05 (木) 20:40:48)
- 4 (2024-09-30 (月) 21:23:34)
- category: swing folder: LimitNumberOfCheckBoxSelections title: JCheckBoxのグループ内で選択可能な上限を設定する tags: [JCheckBox, JComboBox] author: aterai pubdate: 2024-09-02T00:04:12+09:00 description: JCheckBoxを同じJPanelやJComboBoxのリスト配置されているかでグループ化し、そのグループ内で選択可能なJCheckBoxの数を制限します。 image: https://drive.google.com/uc?id=1j3DOxjm7kwL8x6CX4Mdb1vrFahk-3Ntj
概要
JCheckBox
を同じJPanel
やJComboBox
のリスト配置されているかでグループ化し、そのグループ内で選択可能なJCheckBox
の数を制限します。
Screenshot
Advertisement
サンプルコード
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();
}
});
}
}
View in GitHub: Java, Kotlin解説
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を複数選択するのようにドロップダウンリストに
参考リンク
- ItemListenerからItemSelectableを実装するコンポーネントを取得する
- JComboBoxのアイテムとして表示したJCheckBoxを複数選択する
- java - How can I limit the check box selected? - Stack Overflow