How to add action listener that listens to multiple buttons

后端 未结 11 1078
温柔的废话
温柔的废话 2020-11-27 04:25

I\'m trying to figure out what i am doing wrong with action listeners. I\'m following multiple tutorials and yet netbeans and eclipse are giving me errors when im trying to

相关标签:
11条回答
  • 2020-11-27 04:50

    There are good answers here but let me address the more global point of adding action listener that listens to multiple buttons.

    There are two popular approaches.

    Using a Common Action Listener

    You can get the source of the action in your actionPerformed(ActionEvent e) implementation:

    JButton button1, button2; //your button
    
    @Override
    public void actionPerformed(ActionEvent e) {
    
        JButton actionSource = (JButton) e.getSource();
    
        if(actionSource.equals(button1)){
            // YOU BUTTON 1 CODE HERE
        } else if (actionSource.equals(button2)) {
            // YOU BUTTON 2 CODE HERE
        }
    }
    

    Using ActionCommand

    With this approach you setting the actionCommand field of your button which later will allow you to use switch:

    button1.setActionCommand("actionName1");
    button2.setActionCommand("actionName2");
    

    And later:

    @Override
    public void actionPerformed(ActionEvent e) {
        String actionCommand = ((JButton) e.getSource()).getActionCommand();
    
        switch (actionCommand) {
            case "actionName1": 
                // YOU BUTTON 1 CODE HERE
            break;
            case "actionName2": 
                // YOU BUTTON 2 CODE HERE
            break;
        }
    }
    

    Check out to learn more about JFrame Buttons, Listeners and Fields.

    0 讨论(0)
  • 2020-11-27 04:53

    You've been told how to sort your immediate problem, but I think there are more important problems here.

    • stick with conventions. Even for throw-away code. That means initial cases for class names.

    • Don't extend classes you don't need to. JFrame should rarely be extended. In fact, you don't create an instance of your derived class!!!

    • Don't bundle a bunch of things into one class. In particular, you should generally only subtype at most one main class or interface at a time (things like Comparable not included).

    • Always interact, including construct, Swing/AWT GUIs on the AWT Event Dispatch Thread (EDT). It's ugly and verbose, but that's Java for you.

    • Checking a source of an event is a bit of hack. Listeners are small, so you can't even claim the lame performance excuse.

    So:

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    
    public class Calc {
        public static void main(String[] args) {
            java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
                runEDT();
            }});
        }
        private static void runEDT() {
            assert java.awt.EventQueue.isDispatchThread();
    
            JFrame frame = new JFrame();
    
            frame.setSize(100, 100);
    
            JButton button1 = new JButton("1");
            button1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    ...
                }
            });
    
            frame.add(button1);
    
            frame.setVisible(true);
        }
    }
    

    If you need to access any of the variables from the enclosing method within the listener, make them final.

    0 讨论(0)
  • 2020-11-27 04:56

    You are declaring button1 in main method so you can not access it in actionPerform. You should make it global in class.

     JButton button1;
     public static void main(String[] args) {
    
        JFrame calcFrame = new JFrame();
    
        calcFrame.setSize(100, 100);
        calcFrame.setVisible(true);
    
        button1 = new JButton("1");
        button1.addActionListener(this);
    
        calcFrame.add(button1);
    }
    
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == button1)
    }
    
    0 讨论(0)
  • 2020-11-27 04:59

    Here is a modified form of the source based on my comment. Note that GUIs should be constructed & updated on the EDT, though I did not go that far.

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    import javax.swing.JFrame;
    
    public class Calc {
    
        public static void main(String[] args) {
    
            JFrame calcFrame = new JFrame();
    
            // usually a good idea.
            calcFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            final JButton button1 = new JButton("1");
            button1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    JOptionPane.showMessageDialog(
                        button1, "..is the loneliest number");
                }
            });
    
            calcFrame.add(button1);
    
            // don't do this..
            // calcFrame.setSize(100, 100);
    
            // important!
            calcFrame.pack();
    
            calcFrame.setVisible(true);
        }
    }
    
    0 讨论(0)
  • 2020-11-27 05:01

    I'm amazed that nobody has mentioned using an action command. This is a pretty standard way of associating sources and listeners. Its really useful if;

    • you have multiple event sources that need to do the same thing (eg if you want the use to be able to press the enter key on a text field as an alternative to clicking a button next to it)
    • you don't have a ref to the component generating the event

    see;

    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;    
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    public class DontExtendJFrame implements ActionListener {
    
      private enum Actions {
        HELLO,
        GOODBYE
      }
    
      public static void main(String[] args) {
    
        DontExtendJFrame instance = new DontExtendJFrame();
    
        JFrame frame = new JFrame("Test");
        frame.setLayout(new FlowLayout());
        frame.setSize(200, 100);
    
        JButton hello = new JButton("Hello");
        hello.setActionCommand(Actions.HELLO.name());
        hello.addActionListener(instance);
        frame.add(hello);
    
        JButton goodbye = new JButton("Goodbye");
        goodbye.setActionCommand(Actions.GOODBYE.name());
        goodbye.addActionListener(instance);
        frame.add(goodbye);
    
        frame.setVisible(true);
      }
    
      @Override
      public void actionPerformed(ActionEvent evt) {
        if (evt.getActionCommand() == Actions.HELLO.name()) {
          JOptionPane.showMessageDialog(null, "Hello");
        } else if (evt.getActionCommand() == Actions.GOODBYE.name()) {
          JOptionPane.showMessageDialog(null, "Goodbye");
        }
      }
    }
    
    0 讨论(0)
提交回复
热议问题