What I want to is: Create an event that fires if the a JRadioButton contained in the ButtonGroup is selected, and then print the text there is on the JRadioButton.
As per my comment, you can't add a listener to a ButtonGroup. You will likely have to go with an ActionListener added to the individual JRadioButtons.
If this doesn't answer your question, please tell us more details about your problem.
Edit 1
I suppose you could always extend ButtonGroup such that it accepts ActionListeners. For example:
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();
}
}
}
And tested by the following:
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();
}
});
}
}
But this still eventually adds ActionListers to each JRadioButton to achieve its ends; it just does this behind the scenes in the MyButtonGroup's add method override.
Similar approach as accepted answer, though I prefer to control a ButtonGroup by index and retrieve a selection index .
/**
* Extend javax.swing.ButtonGroup with Listener
* @author Sam Ginrich
*
*/
@SuppressWarnings("serial")
public class ButtonGroupWL extends ButtonGroup implements ActionListener
{
/**
* @wbp.parser.entryPoint
*/
public ButtonGroupWL(AbstractButton... buttons)
{
super();
listeners = new ArrayList<Listener>();
for (AbstractButton b : buttons)
{
add(b);
}
}
static public interface Listener
{
void onNewSelection(AbstractButton sel, int btnIndex);
}
public void select(int index)
{
buttons.get(index).setSelected(true);
}
@Override
public void add(AbstractButton button)
{
super.add(button);
button.addActionListener(this);
}
@Override
public void remove(AbstractButton button)
{
button.removeActionListener(this);
super.remove(button);
}
public void addListener(Listener listener)
{
listeners.add(listener);
}
public void removeListener(Listener listener)
{
listeners.remove(listener);
}
@Override
public void actionPerformed(ActionEvent e)
{
Object src = e.getSource();
int index = super.buttons.indexOf(src);
if (index < 0)
{
return;
}
for (Listener l : listeners)
{
l.onNewSelection((AbstractButton) src, index);
}
}
protected List<Listener> listeners;
}
Applied:
JRadioButton rdbtnLocalRepo, rdbtnRemoteRepo;
// ...
buttonGroup = new ButtonGroupWL(rdbtnLocalRepo, rdbtnRemoteRepo);
buttonGroup.select(0); // Initial selection
buttonGroup.addListener(new ButtonGroupWL.Listener()
{
@Override
public void onNewSelection(AbstractButton sel, int btnIndex)
{
System.out.println("Button " + btnIndex + " selected");
}
});
Note: @wbp.parser.entryPoint is an adaption for the Eclipse WindowBuilder PlugIn
© 2022 - 2024 — McMap. All rights reserved.