Listening to ButtonGroup for "child" changes and printing selected text JRadioButton

I want: Create an event that fires if the JRadioButton contained in the ButtonGroup is selected, and then print the text that is on the JRadioButton.

+8
java swing buttongroup jradiobutton
source share
1 answer

According to my comment, you cannot add a listener to ButtonGroup. You may have to go with an ActionListener added to the individual JRadioButtons.

If this does not answer your question, let us know more about your problem.

Change 1
I suppose you can always extend ButtonGroup so 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 as follows:

 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 it still ultimately adds ActionListers for each JRadioButton to achieve their goals; he just does this behind the scenes in overriding the method of adding MyButtonGroup.

+11
source share

All Articles