2

いくつかのラジオ ボタンを含む JPanel Child を作成しました。ラジオ ボタンがクリックされるたびに、子からも ActionEvent が生成されるようにします。このアクション イベントには、実際にイベントを生成したボタンへの参照が「含まれる」必要があります。

この子は、個々のラジオ ボタンをリッスンする代わりに、子からのイベントをリッスンする別の JPanel 親内のコンポーネントとして使用されます。

これどうやってするの ?

これまでのコード -

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RadioListener extends JPanel implements ActionListener{

public static final String id = "id";

public RadioListener(){

    for(int i = 1; i < 5; i++){
        JRadioButton jrb = new JRadioButton(i + "", false);
        jrb.putClientProperty(id, i);
        this.add(jrb);
        jrb.addActionListener(this);

    }

}


public void actionPerformed(ActionEvent e){

    JRadioButton jrb = (JRadioButton) e.getSource(); 
    Integer id = (Integer) jrb.getClientProperty(RadioListener.id);
    System.out.println("id " + id);

}


public static void main(String[]args){

    JFrame frame = new JFrame("Radio buttons");
    frame.getContentPane().setLayout(new FlowLayout());
    frame.setSize(400, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new RadioListener());
    frame.setVisible(true);


}

}
4

3 に答える 3

3

コンポーネントが他の利害関係者が関心を登録するためのプロキシとして機能する機能を提供することをお勧めします。

これは、他のコンポーネントが呼び出したりアクセスしたりしてはならないメソッド/コンポーネントを公開する必要がないことを意味します。

また、リスナーに内部クラスを使用する必要があります。これにより、他の人がアクセスできない他のメソッドが公開されるのを防ぐことができます。

public class ProxyActionListener extends JPanel {

    public static final String id = "id";
    private List<JRadioButton> buttons;

    public ProxyActionListener() {

        buttons = new ArrayList<>(25);
        ActionHandler actionHandler = new ActionHandler();

        for (int i = 1; i < 5; i++) {
            JRadioButton jrb = new JRadioButton(i + "", false);
            jrb.putClientProperty(id, i);
            this.add(jrb);
            jrb.addActionListener(actionHandler);
            buttons.add(jrb);

        }

    }

    public void addActionListener(ActionListener listener) {
        for (JRadioButton btn : buttons) {
            btn.addActionListener(listener);
        }
    }

    public void removeActionListener(ActionListener listener) {
        for (JRadioButton btn : buttons) {
            btn.removeActionListener(listener);
        }
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                ProxyActionListener pal = new ProxyActionListener();
                pal.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JRadioButton jrb = (JRadioButton) e.getSource();
                        Integer id = (Integer) jrb.getClientProperty(ProxyActionListener.id);
                        System.out.println("Proxy- id " + id);
                    }
                });

                JFrame frame = new JFrame("Radio buttons");
                frame.getContentPane().setLayout(new FlowLayout());
                frame.setSize(400, 100);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(pal);
                frame.setVisible(true);
            }
        });
    }

    protected class ActionHandler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            JRadioButton jrb = (JRadioButton) e.getSource();
            Integer id = (Integer) jrb.getClientProperty(ProxyActionListener.id);
            System.out.println("id " + id);

        }
    }
}
于 2013-04-01T23:55:34.703 に答える
3

MadProgrammer の推奨事項 (1+) をさらに一歩進めるには、この目的のために Swing コンポーネントの組み込み PropertyChangeSupport を使用できます。

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

@SuppressWarnings("serial")
public class RadioListenerTesterHFOE extends JPanel {
   private RadioListenerHFOE radioListenerHfoe = new RadioListenerHFOE();

   public RadioListenerTesterHFOE() {
      add(radioListenerHfoe);
      radioListenerHfoe.addPropertyChangeListener(new PropertyChangeListener() {

         @Override
         public void propertyChange(PropertyChangeEvent pcEvt) {
            if (pcEvt.getPropertyName().equals(RadioListenerHFOE.RADIO)) {
               System.out.println("Radio Selected: " + pcEvt.getNewValue());
            }
         }
      });
   }

   private static void createAndShowGui() {
      RadioListenerTesterHFOE mainPanel = new RadioListenerTesterHFOE();

      JFrame frame = new JFrame("RadioListenerTesterHFOE");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class RadioListenerHFOE extends JPanel {
   private static final String[] LABELS = {"1", "2", "3", "4"};
   private static final int GAP = 5;
   public static final String RADIO = "radio";
   private ButtonGroup buttonGroup = new ButtonGroup();
   private RadioListenerHandler handler = new RadioListenerHandler();

   public RadioListenerHFOE() {
      setLayout(new GridLayout(1, 0, GAP, 0));
      for (String label : LABELS) {
         JRadioButton radioButton = new JRadioButton(label);
         radioButton.setActionCommand(label);
         radioButton.addActionListener(handler);
         buttonGroup.add(radioButton);
         add(radioButton);
      }      
   }

   private class RadioListenerHandler implements ActionListener {
      private String actionCommand = null;

      @Override
      public void actionPerformed(ActionEvent evt) {
         setActionCommand(evt.getActionCommand());
      }

      private void setActionCommand(String actionCommand) {
         String oldValue = this.actionCommand;
         String newValue = actionCommand;
         this.actionCommand = newValue;
         firePropertyChange(RADIO, oldValue, newValue);
      }
   }

}
于 2013-04-02T01:07:59.770 に答える
0

この解決策は十分ですか?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class RadioListener extends JPanel{

public static final String id = "id";
private ActionListener privateActionListener;
JRadioButton[] btns = new JRadioButton[5];

public RadioListener(){

    for(int i = 0; i < btns.length; i++){
        JRadioButton jrb = new JRadioButton(i + "", false);
        jrb.putClientProperty(id, i);
        btns[i] = jrb;
        this.add(jrb);      
    }

}


public static void main(String[]args){

    JFrame frame = new JFrame("Radio buttons");
    frame.getContentPane().setLayout(new FlowLayout());
    frame.setSize(400, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    AnActionListener an = new AnActionListener();
    RadioListener rl = new RadioListener();
    rl.setActionListener(an);
    frame.getContentPane().add(rl);
    frame.setVisible(true);


}


public ActionListener getActionListener() {
    return privateActionListener;
}


public void setActionListener(ActionListener privateActionListener) {

    this.privateActionListener = privateActionListener;
    for(int i = 0; i < btns.length; i ++){

        btns[i].addActionListener(privateActionListener);

    }

}



}


class AnActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){

    JRadioButton jrb = (JRadioButton) e.getSource(); 
    Integer id = (Integer) jrb.getClientProperty(RadioListener.id);
    System.out.println("id " + id);

}

}
于 2013-04-01T23:51:35.370 に答える