Listening on ButtonGroup for "child" changes, and print selected JRadioButton's text
Asked Answered
S

2

10

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.

Subsistent answered 30/7, 2011 at 14:2 Comment(0)
S
16

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.

Suppletion answered 30/7, 2011 at 14:20 Comment(0)
I
0

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

Irwin answered 18/6, 2023 at 16:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.