In der Regel ist ein Objekt erforderlich, das mit dem ausgewählten Optionsfeld verbunden ist. Es ist nicht unbedingt ein String
die die Beschriftung der Schaltfläche darstellt. Es könnte ein Integer
mit dem Index der Schaltfläche oder ein Objekt von komplizierterem Typ T
. Sie können eine Map<ButtonModel, T>
als Tom Hawtin vorgeschlagen, aber ich schlage vor, das Modell zu erweitern und die Objekte dort zu platzieren. Hier ist eine verbesserte ButtonGroup
die diesen Ansatz verfolgt.
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 Hilfsklasse anstelle von ButtonGroup
. Erstellen Sie ein Objekt dieser Klasse und fügen Sie ihm Schaltflächen mit den zugehörigen Objekten 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); // select the 3rd button
group.add(button, i);
panel.add(button);
}
Danach können Sie das Objekt, das mit der aktuell ausgewählten Schaltfläche verbunden ist, jederzeit abrufen, indem Sie einfach getSelectedObject()
etwa so:
int selectedButtonIndex = group.getSelectedObject();
Für den Fall, dass 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();
}
}