处理另一个类中的JButton click事件

Yoa*_*oav 7 java events swing

我是来自C#的java的新手,所以我不熟悉java最佳实践.

我有一个主类打开一个JFrame来从用户获取几个输入字符串.当用户单击提交时,GUI应该关闭,主类继续使用输入进行处理.

这是主要类:

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
}
Run Code Online (Sandbox Code Playgroud)

主类将使用此框架从用户获取输入:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我能找到的所有例子中,听众本身就是一个FMain.但是在这种情况下,我希望Main监听并使用方法startProcess中的输入.

将Main实现ActionListener,并将其传递给FMain构造函数是可行的方法吗?

fir*_*w52 5

是的,这是正确的想法.但是,为了能够做到这一点,你必须做两件事:

  1. 把它放在课程的开头FInput:

    Main m = new Main(this);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,将这些行放在Main课堂的某个地方......

    FInput gui;
    
    public Main(FInput in) { gui = in; }
    
    Run Code Online (Sandbox Code Playgroud)

现在,您可以指代任何组件的FInput类从Main做这样的事情类.

gui.someComponent ...
Run Code Online (Sandbox Code Playgroud)

设置监听器只是写someComponent.addItemListener(m);或类似的东西.

希望这可以帮助!


@Yoav回复你的最新评论......

您不必将监听类与GUI类分开; 你可以将两者合二为一......

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)