JCheckBoxのグループ内で選択可能な上限を設定する
Total: 743, 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();
}
});
}
}
View in GitHub: Java, KotlinDescription
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つのみになる