Як правило, потрібен якийсь об’єкт, пов’язаний із вибраним перемикачем. Це не обов'язково Stringпредставляє ярлик кнопки. Це може бути Integerвміст індексу кнопки або об’єкт більш складного типу T. Ви можете заповнити та використати знак, Map<ButtonModel, T>як запропонував Том Хотин , але я пропоную розширити модель і розмістити там об’єкти. Ось покращений, ButtonGroupякий використовує цей підхід.
import javax.swing.*;
@SuppressWarnings("serial")
public class SmartButtonGroup<T> extends ButtonGroup {
@Override
public void add(AbstractButton b) {
throw new UnsupportedOperationException("No object supplied");
}
public void add(JRadioButton button, T attachedObject) {
ExtendedModel<T> model = new ExtendedModel<>(attachedObject);
model.setSelected(button.isSelected());
button.setModel(model);
super.add(button);
}
@SuppressWarnings("unchecked")
public T getSelectedObject() {
ButtonModel selModel = getSelection();
return selModel != null ? ((ExtendedModel<T>)selModel).obj : null;
}
public static class ExtendedModel<T> extends javax.swing.JToggleButton.ToggleButtonModel {
public T obj;
private ExtendedModel(T object) {
obj = object;
}
}
}
Ви можете використовувати цей клас корисності замість ButtonGroup. Створіть об’єкт цього класу та додайте до нього кнопки разом із пов’язаними об’єктами. Наприклад,
SmartButtonGroup<Integer> group = new SmartButtonGroup<>();
JPanel panel = new JPanel();
for (int i = 1; i <= 5; i++) {
JRadioButton button = new JRadioButton("Button #" + i, i == 3);
group.add(button, i);
panel.add(button);
}
Після цього ви можете отримати об’єкт, пов’язаний із вибраною в даний момент кнопкою, у будь-який час, коли вам потрібно, просто зателефонувавши getSelectedObject(), наприклад:
int selectedButtonIndex = group.getSelectedObject();
Якщо вам потрібні лише самі кнопки, замість цього ви можете використовувати наступний не-загальний клас.
import javax.swing.JRadioButton;
@SuppressWarnings("serial")
public class RadioButtonGroup extends SmartButtonGroup<JRadioButton> {
public void add(JRadioButton button) {
super.add(button, button);
}
@Override
public void add(JRadioButton button, JRadioButton attachedObject) {
throw new UnsupportedOperationException("Use the short form of addition instead");
}
public JRadioButton getSelectedButton() {
return getSelectedObject();
}
}