2
votes

Is it possible to have a button on one file and its actionPerformed(ActionEvent e) method in a different file? I am trying to add an actionListener to a button, choose1 which is in file trialdump.java but the actionPerformed(ActionEvent e) method is in file listen.java. I tried extending public class trialdump extends listen but it shows an error. Any idea how I can add the method to the button? Thanks.

Here is my code in file trialdump.java:

package Core;

import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.*;
import java.awt.*;

// Create a simple GUI window
public class trialdump {

private static void createWindow() {

    // Create and set up the window.
    JFrame frame = new JFrame("PDF Denoiser");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // My edit
    JPanel panel = new JPanel();
    GroupLayout layout = new GroupLayout(panel);
    panel.setLayout(layout);

    layout.setAutoCreateGaps(true);
    layout.setAutoCreateContainerGaps(true);

    JLabel label1 = new JLabel("Image File");
    JLabel label2 = new JLabel("Destination");
    JLabel label3 = new JLabel("Preview");

    JTextField current = new JTextField();
    JTextField dest = new JTextField();
    JTextArea preview = new JTextArea();

    preview.setEditable(false);
    JScrollPane previewScrollPane = new JScrollPane(preview);

    JButton choose1 = new JButton("Search1");
    JButton choose2 = new JButton("Search2");
    JButton algo1 = new JButton("MDWM");
    JButton algo2 = new JButton("BFMR");
    JButton algo3 = new JButton("Mine");



    // Horizontal arrangement
    layout.setHorizontalGroup(layout
            .createSequentialGroup()
            .addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(label1)
                            .addComponent(label2).addComponent(label3))
            .addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(current)
                            .addComponent(dest).addComponent(preview))
            .addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(choose1)
                            .addComponent(choose2).addComponent(algo1).addComponent(algo2).addComponent(algo3)));

    layout.linkSize(SwingConstants.HORIZONTAL, choose1, choose2, algo1, algo2, algo3);

    // Vertical arrangement
    layout.setVerticalGroup(layout
            .createSequentialGroup()
            .addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(label1)
                            .addComponent(current).addComponent(choose1))
            .addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(label2)
                            .addComponent(dest).addComponent(choose2))
            .addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                            .addComponent(label3)
                            .addComponent(preview)
                            .addGroup(
                                    layout.createSequentialGroup().addComponent(algo1).addComponent(algo2)
                                            .addComponent(algo3))));

    // Display the window.
    frame.setLocationRelativeTo(null);
    frame.add(panel);
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {

    createWindow();

}
}

And here is my code in listen.java:

package components;

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.*;

public class listen extends JPanel implements ActionListener{

static private String newline = "\n";
private JTextArea log;
private JFileChooser fc;

public listen() {



}

public void actionPerformed(ActionEvent e) {
    //Set up the file chooser.
    if (fc == null) {
        fc = new JFileChooser();

    //Add a custom file filter and disable the default
    //(Accept All) file filter.
        fc.addChoosableFileFilter(new imagefilter());
        fc.setAcceptAllFileFilterUsed(false);

    //Add custom icons for file types.
        fc.setFileView(new imagefileview());

    //Add the preview pane.
        fc.setAccessory(new imagepreview(fc));
    }

    //Show it.
    int returnVal = fc.showDialog(listen.this,
                                  "Attach");

    //Process the results.
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File file = fc.getSelectedFile();

    } else {
        log.append("Attachment cancelled by user." + newline);
    }
    log.setCaretPosition(log.getDocument().getLength());

    //Reset the file chooser for the next time it's shown.
    fc.setSelectedFile(null);
}

/**
 * Create the GUI and show it.  For thread safety,
 * this method should be invoked from the
 * event dispatch thread.
 */


public static void main(String[] args) {
    //Schedule a job for the event dispatch thread:
    //creating and showing this application's GUI.
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            //Turn off metal's use of bold fonts
            UIManager.put("swing.boldMetal", Boolean.FALSE);

        }
    });
}
}
3
Its possible. Listener can be in a separate file.Sudhanshu Umalkar
Hi Sudhanshu, can you show me an example how to do it? Much appreciated.evarey
The answer is "Yes". In fact in the days before inner classes, this was the only way to do it...ahhh, the days. So long as the class you are trying to register to the button implements ActionListener you shouldn't have problems.MadProgrammer
You might find it of benefit to read through How to use Action ListenersMadProgrammer

3 Answers

2
votes

You can add the listener defined in another class doing something like this

JButton choose1 = new JButton("Search1");
choose1.addActionListener(new listen());

BTW, you should take care of some more bits of your code:

  • Classs names should be typed in CamelCase with the first letter capital
  • Use proper names for your packages
  • I don't think that the main method in the listener class is making anything usefull
  • There is not need at all to extend from JPanel in your listener class
  • Try to avoid make empty constructor, like you are doing in listen(). At least call super(), or just, don't include it.
1
votes

Just the sample code, you can make the changes on similar lines-

class Some extends JFrame {

    private JButton button = new JButton("Something");

    Some() {
        button.addActionListener(new MyListener());
    }
}

class MyListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // do something
    }    
}
1
votes

The proper way of doing this is by extending the the AbstractAction class adding all your action code to it's actionPerformed method, and then passing a new instance of it to either the JButton's constructor or by calling setAction on the JButton.

Here's a link to help clear it all out for you.