Thông thường, một số đối tượng được liên kết với nút radio đã chọn là bắt buộc. Nó không nhất thiết phải String
đại diện cho nhãn của nút. Nó có thể là một Integer
chứa chỉ mục của nút hoặc một đối tượng thuộc loại phức tạp hơn T
. Bạn có thể điền và sử dụng một Map<ButtonModel, T>
như Tom Hawtin đề xuất, nhưng tôi đề xuất mở rộng mô hình và đặt các đối tượng ở đó. Đây là một cải tiến ButtonGroup
sử dụng phương pháp này.
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;
}
}
}
Bạn có thể sử dụng lớp tiện ích này thay vì ButtonGroup
. Tạo một đối tượng của lớp này và thêm các nút cùng với các đối tượng liên kết với nó. Ví dụ,
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);
}
Sau đó, bạn có thể lấy đối tượng được liên kết với nút hiện được chọn bất cứ lúc nào bạn cần bằng cách chỉ cần gọi getSelectedObject()
, như sau:
int selectedButtonIndex = group.getSelectedObject();
Trong trường hợp bạn chỉ cần các nút, bạn có thể sử dụng lớp không chung chung tiếp theo để thay thế.
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();
}
}