2011-07-30 20 views

Odpowiedz

11

Zgodnie z moim komentarzem, nie można dodać detektora do ButtonGroup. Prawdopodobnie będziesz musiał użyć ActionListener dodanego do poszczególnych JRadioButtons.

Jeśli to nie rozwiąże problemu, powiedz nam więcej szczegółów na temat problemu.

Edycja 1
Przypuszczam można zawsze przedłużyć buttonGroup taki sposób, że przyjmuje ActionListeners. Na przykład:

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(); 
     } 
    } 
} 

i przetestowane brzmienie:

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(); 
     } 
     }); 
    } 
} 

Ale to jeszcze ostatecznie dodaje ActionListers każdemu JRadioButton do osiągnięcia jego celów; robi to za kulisami w override metody dodawania MyButtonGroup.