In der Regel ist ein Objekt erforderlich, das dem ausgewählten Optionsfeld zugeordnet ist. Es ist nicht unbedingt eine String
Darstellung der Beschriftung der Schaltfläche. Dies kann ein Integer
Index der Schaltfläche oder ein Objekt eines komplizierteren Typs sein T
. Sie könnten ein füllen und verwenden, Map<ButtonModel, T>
wie von Tom Hawtin vorgeschlagen, aber ich schlage vor, das Modell zu erweitern und die Objekte dort zu platzieren. Hier ist eine Verbesserung ButtonGroup
, die diesen Ansatz verwendet.
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;
}
}
}
Sie können diese Dienstprogrammklasse anstelle von verwenden ButtonGroup
. Erstellen Sie ein Objekt dieser Klasse und fügen Sie Schaltflächen sowie zugehörige Objekte hinzu. Zum Beispiel,
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);
}
Danach können Sie das Objekt, das der aktuell ausgewählten Schaltfläche zugeordnet ist, jederzeit abrufen, indem Sie einfach Folgendes aufrufen getSelectedObject()
:
int selectedButtonIndex = group.getSelectedObject();
Wenn Sie nur die Schaltflächen selbst benötigen, können Sie stattdessen die nächste nicht generische Klasse verwenden.
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();
}
}