Jack_of_All_Trades
Jack_of_All_Trades

Reputation: 11498

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

Upvotes: 0

Views: 707

Answers (1)

Daniel Kaplan
Daniel Kaplan

Reputation: 67514

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

}

Upvotes: 1

Related Questions