Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handle JButton click event in another class

Tags:

java

events

swing

I'm new to java coming from C# so I'm not familiar with java best practices.

I have a main class that opens a JFrame to get several input strings from a user. When the user clicks submit the GUI should close and the main class continue processing using the input.

This is the main class:
public class Main {
    FInput fInput;

    public void main(String[] args) {
        if(args.length==0)
        {
            fInput = new FInput();
            fInput.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fInput.pack();
            fInput.setVisible(true);
        }
    else
        startProcess(args);
    }

    public void startProcess(String[] args) {
// Do stuff
}

The main class will use this frame to get input from the user:

public class FInput extends JFrame{
    private JTextField txtSourceDirectory;
    private JTextField txtTargetDirectory;
    private JTextField txtDefectNumber;
    private JTextField txtSliceTokens;
    private JButton btnStart;

    public FInput() {
        // Initialize text fields and button
        JButton.addActionListener(something);
    }
}

In all the examples I could find, the listener would be a FMain itself. However in this case I want Main to listen and use the input in method startProcess.

Would having Main implement ActionListener, and passing it to FMain constructor is the way to go?
like image 525
Yoav Avatar asked Sep 17 '11 10:09

Yoav


2 Answers

Yes, that is the right idea. You must do two things in order to be able to do that, though:

  1. Put this at the beginning of the FInput class:

    Main m = new Main(this);
    
  2. Then, put these lines somewhere in the Main class...

    FInput gui;
    
    public Main(FInput in) { gui = in; }
    

Now you can refer to any component in the FInput class from the Main class by doing something like this.

gui.someComponent ...

To set up listeners just write someComponent.addItemListener(m); or something of the sort.

Hope this helps!


@Yoav In response to your latest comment...

You don't have to separate the listening class from the GUI class; you can combine the two into one class...

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame implements ActionListener {

    private JTextField txtSourceDirectory;
    private JTextField txtTargetDirectory;
    private JTextField txtDefectNumber;
    private JTextField txtSliceTokens;
    private JButton btnStart;

    public Main() {
        txtSourceDirectory = new JTextField(40); //change this to the amount of characters you need
        txtTargetDirectory = new JTextField(40);
        txtDefectNumber = new JTextField(40);
        txtSliceTokens = new JTextField(40);
        btnStart = new JButton("Start");
        add(txtSourceDirectory);
        add(txtTargetDirectory);
        add(txtDefectNumber);
        add(txtSliceTokens);
        add(btnStart);
        btnStart.addActionListener(this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public void actionPerformed(ActionEvent event) {
        //do stuff
    }

    static void startProcess(String[] ARGS) {
        //do stuff
    }

    public static void main(String[] args) {
        if (args.length == 0) {
            Main frame = new Main();
        } else {
            startProcess(args);
        }
    }
}
like image 178
fireshadow52 Avatar answered Oct 11 '22 10:10

fireshadow52


Also consider using JOptionPane, shown here, in your Main class. You can customize the appearance, including button text, as shown in How to Make Dialogs.

like image 32
trashgod Avatar answered Oct 11 '22 08:10

trashgod