简体   繁体   中英

handling events in java swing

How can I assign two buttons to share the same class for handling events in Java/swing?

For example, I have this:

private class BtnEvtHandler implements ActionListener {

        private int counter=10;

        public void actionPerformed(ActionEvent e) {
            gs.setX(counter);
            gs.repaint();
            counter=counter+10;
        }

        public void actionPerformed(ActionEvent e) {

                //action for move button
        }

    }

        JButton jumpBtn= new JButton("JUMP");
        BtnEvtHandler okButtonHandler= new BtnEvtHandler(); 
        (jumpBtn).addActionListener(okButtonHandler);
        menuPanel.add(jumpBtn);

Now I want to add another button as below which can have the same class as event handler but dispatches to different actionPerformed as mentioned in above code.

        JButton moveBtn= new JButton("MOVE");
        menuPanel.add(moveBtn);
        (moveBtn).addActionListener(okButtonHandler);

You can't reuse one ActionListener and expect it to call a different method depending on the button you attach it to. The contract of ActionListener has one method that gets called. But you can check the source of the event and have flow control based on that. Here's an example:

package com.sandbox;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

public class SwingSandbox {

    public static void main(String[] args) throws IOException {
        JFrame frame = buildFrame();

        JPanel pane = new JPanel();

        MyActionListener myActionListener = new MyActionListener();

        JButton button1 = new JButton("Button1");
        button1.addActionListener(myActionListener);
        pane.add(button1);
        JButton button2 = new JButton("Button2");
        button2.addActionListener(myActionListener);
        pane.add(button2);


        frame.add(pane);
    }


    private static JFrame buildFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
        return frame;
    }


    private static class MyActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            JButton source = (JButton) e.getSource();
            if ("Button1".equals(source.getText())) {
                System.out.println("You clicked button 1");
            } else {
                System.out.println("You clicked button 2");
            }
        }
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM