使用多个 JButtons/JRadioButtons 时是否需要执行多个操作的方法?

are multiple action performed methods needed when using multiple JButtons/JRadioButtons?

我的问题基本上只是标题,但我的代码中有一个按钮可以显示一些 JRadiobuttons,我是否需要制作另一个执行操作的方法并给它一个不同的名称或其他名称?当我使用相同的操作执行方法时没有任何反应。

很喜欢:

@Override
    public void actionPerformed(ActionEvent a) {

        if( a.getSource() == button1 ) {

      System.out.println("hi");
      }
}
  @Override
  public void ActionPerformed(ActionEvent b){
    if(b.getSource()==firstJRadioButton){
        System.out.println("hi there");
    }
    
  }```

The code above gives me an error and is not my exact code, but I hope it sort of says what I am trying to do if that makes sense.

最好将您真正的工作代码放在一个问题中。

简短的回答是你需要制作另一个 ActionListener object, with 另一个 actionPerformed 方法,或调整您的单一 actionPerformed 方法来处理 所有 您的组件。

ActionListener 是 class 的实例,它实现了 ActionListener 接口,因此每个 class.[=23= 只能有一个动作侦听器]

这意味着有两种方式处理多个组件的动作:

有一个 ActionListener 实例,然后检查哪个组件执行了操作:
public class ListenerEg extends JFrame implements ActionListener {

    public ListenerEg() throws HeadlessException {
        this.button1 = new JButton("button 1");
        this.button2 = new JButton("button 2");
        this.setLayout(new FlowLayout());
        this.add(button1);
        button1.addActionListener(this);
        this.add(button2);
        button2.addActionListener(this);
        this.pack();
    }
    JButton button1;
    JButton button2;
    public static void main(String[] args) {
        new ListenerEg().setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button1) {
            System.out.println("Button 1");
        } else if (e.getSource() == button2) {
            System.out.println("Button 2");
        }
    }
}
每个组件都有一个 ActionListener。这是一种更好的方法,因为您的 ActionListener 实现不会以您的所有代码结束。
public class ListenerEg extends JFrame {

    public ListenerEg() throws HeadlessException {
        this.button1 = new JButton("button 1");
        this.button2 = new JButton("button 2");
        this.setLayout(new FlowLayout());
        this.add(button1);
        button1.addActionListener(e -> {
            System.out.println("Button 1");
        });
        this.add(button2);
        button2.addActionListener(e -> {
            System.out.println("Button 2");
        });
        this.pack();
    }
    JButton button1;
    JButton button2;
    public static void main(String[] args) {
        new ListenerEg().setVisible(true);
    }
}

您不必为 ActionListener 使用 lambda,您可以创建自己的 ActionListener 实现的 class 层次结构以重用公共代码并提高可测试性:

public class ListenerEg extends JFrame {
    private final JButton button1;
    private final JButton button2;

    public ListenerEg() throws HeadlessException {
        this.button1 = new JButton("button 1");
        this.button2 = new JButton("button 2");
        this.setLayout(new FlowLayout());
        this.add(button1);
        button1.addActionListener(new ButtonActionListener());
        this.add(button2);
        button2.addActionListener(new ButtonActionListener());
        this.pack();
    }


    public static void main(String[] args) {
        new ListenerEg().setVisible(true);
    }

    private static class ButtonActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton b = (JButton)e.getSource();
            System.out.println(b.getText());
        }
    }
}

(这些不是最佳实践Swing程序,只是说明这一点的最短方法)