Як правило, потрібен якийсь об’єкт, пов’язаний із вибраним перемикачем. Це не обов'язково 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();
}
}