gpt4 book ai didi

java - 在 ButtonGroup 上监听 "child"更改,并打印选定的 JRadioButton 的文本

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:37:42 25 4
gpt4 key购买 nike

我想要的是:创建一个事件,如果包含在 ButtonGroup 中的 JRadioButton 被选中,该事件将触发,然后打印 JRadioButton 上的文本。

最佳答案

根据我的评论,您不能向 ButtonGroup 添加监听器。您可能需要将 ActionListener 添加到各个 JRadioButtons。

如果这不能回答您的问题,请告诉我们有关您的问题的更多详细信息。

编辑 1
我想您总是可以扩展 ButtonGroup,使其接受 ActionListeners。例如:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.event.EventListenerList;

@SuppressWarnings("serial")
public class MyButtonGroup extends ButtonGroup {
private ActionListener btnGrpListener = new BtnGrpListener();
private EventListenerList listenerList = new EventListenerList();

@Override
public void add(AbstractButton b) {
b.addActionListener(btnGrpListener);
super.add(b);
}

public void addActionListener(ActionListener listener) {
listenerList.add(ActionListener.class, listener);
}

public void removeActionListener(ActionListener listener) {
listenerList.remove(ActionListener.class, listener);
}

protected void fireActionListeners() {
Object[] listeners = listenerList.getListenerList();
String actionCommand = "";
ButtonModel model = getSelection();
if (model != null) {
actionCommand = model.getActionCommand();
}
ActionEvent ae = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, actionCommand);
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]== ActionListener.class) {
((ActionListener)listeners[i+1]).actionPerformed(ae);
}
}
}

private class BtnGrpListener implements ActionListener {

public void actionPerformed(ActionEvent ae) {
fireActionListeners();
}
}
}

并通过以下测试:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class MyButtonGroupTest {
private static void createAndShowUI() {
String[] data = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};

JPanel panel = new JPanel(new GridLayout(0, 1));
MyButtonGroup myBtnGrp = new MyButtonGroup();
myBtnGrp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Action Command is: " + e.getActionCommand());
}
});

for (String text : data) {
JRadioButton radioBtn = new JRadioButton(text);
radioBtn.setActionCommand(text);
myBtnGrp.add(radioBtn);
panel.add(radioBtn);
}

JFrame frame = new JFrame("MyButtonGroupTest");
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}

但这最终还是会向每个 JRadioButton 添加 ActionListers 以达到目的;它只是在 MyButtonGroup 的 add 方法重写的幕后执行此操作。

关于java - 在 ButtonGroup 上监听 "child"更改,并打印选定的 JRadioButton 的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com