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

时间:2011-09-17 10:32:04

标签: java swing events

我是来自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
}

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

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

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

将Main实现ActionListener并将其传递给FMain构造函数是否可行?

3 个答案:

答案 0 :(得分:5)

是的,这是正确的想法。但是,你必须做两件事才能做到这一点:

  1. 将它放在FInput类的开头:

    Main m = new Main(this);
    
  2. 然后,将这些行放在Main类......

    中的某个位置
    FInput gui;
    
    public Main(FInput in) { gui = in; }
    
  3. 现在,你可以通过这样的方式引用FInputMain类中的任何组件。

    gui.someComponent ...
    

    要设置侦听器,只需编写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);
            }
        }
    }
    

答案 1 :(得分:2)

java中的第一个主要方法必须是 public static void 。以下是如何做到这一点的示例。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * Main class is frame but also implements ActionListener interface.
 */
public class Main extends JFrame implements ActionListener {
    private JButton btnStart;
    private static Main frame;

    public Main() {
        JPanel panel = new JPanel();
        btnStart = new JButton("Press me");

        // Add action listener. Listener could be any class that implements
        // ActionListener
        btnStart.addActionListener(this);

        // This means add button btnStart to panel
        panel.add(btnStart);

        // This means add panel to frame
        this.add(panel);
    }

    // main method in java always must be public, static and void. You forgot to
    // put static.
    public static void main(String[] args) {
        if (args.length == 0) {
            frame = new Main();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        } else
            frame.startProcess(args);
    }

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

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // Here you put your code that is executed every time you press button.
        // For example you just want to show message.
        JOptionPane.showMessageDialog(this, "You pressed Button.");

    }
}

但是有特殊课程要好得多。例如:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;


    public class ButtonListener implements ActionListener {
        JFrame parent;

        public ButtonListener(JFrame parent) {
            this.parent = parent;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(parent, "You pressed Button");
        }

    }

在主类中,您只需向按钮添加动作侦听器:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * Main class is frame but also implements ActionListener interface.
 */
public class Main extends JFrame {
    private JButton btnStart;
    private static Main frame;

    public Main() {
        JPanel panel = new JPanel();
        btnStart = new JButton("Press me");


        ButtonListener listener = new ButtonListener(this);
        // Add action listener. Listener could be any class that implements
        // ActionListener
        btnStart.addActionListener(listener);

        // This means add button btnStart to panel
        panel.add(btnStart);

        // This means add panel to frame
        this.add(panel);
    }

    // main method in java always must be public, static and void. You forgot to
    // put static.
    public static void main(String[] args) {
        if (args.length == 0) {
            frame = new Main();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        } else
            frame.startProcess(args);
    }

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

答案 2 :(得分:2)

另请考虑在Main课程中使用显示为JOptionPanehere。您可以自定义外观,包括button text,如How to Make Dialogs

中所示