JCheckBoxのグループ内で選択可能な上限を設定する
Total: 182
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
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
- CheckboxGroup (Java Platform SE 8)
java.awt.Checkbox
をグループ化するCheckboxGroup
が存在するが、選択可能なCheckbox
は1
つのみになる