如何暂停具有main()的程序,直到按下GUI按钮为止?

时间:2014-04-13 21:57:19

标签: java swing user-interface jframe actionlistener

我是Java Swing的新手。 我有两个Java文件。其中一个是main(),另一个是GUI文件。

客户端

class Client
{
    GUI gui;
    public static void main(String args[])
    {
        //.......... do something.......
        gui = new GUI();
        // at thin point I want to have value of gui.s1 ....
        //but main() actually do not wait for the user input.
    }
}

GUI

class GUI extends JFrame implements ActionListener
{
    String s1="";

    GUI()
    {
        JTextField t1= new JTextField(20);
        JButton j1= new JButton("submit");
        j1.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e)
    {         
        s1=t1.getText();
    } 
}

请指导我,如果这是不合适的问题那么请告诉我你认为我应该阅读的文章以获得这个概念。

3 个答案:

答案 0 :(得分:2)

现在我正在打电话,所以我无法帮助你解决代码我会试着让你理解这个概念:用户输入,按钮点击是5秒后可能发生的事情,就像30分钟后可能发生的那样。所以是的,你可以让你有时睡觉,希望输入,等到.s1得到一个值等等。

但是,我不认为这是正确的做法。可以使用的最好的东西是当用户单击按钮时调用的回调。它是使用接口完成的。

首先,您声明一个名为OnRequestClick的接口,您可以在其中实现onRequestClick(String message);方法。

消息将是s1的文本。

现在在GUI类中创建一个类型为OnRequestClick的新字段名为listener并将其带入构造函数中。

现在,在创建GUI对象的地方,编译器会要求您为OnRequestClick提供代码,这样就可以了,当用户按下tbe按钮时,代码将被执行。

嗯,现在我说的是假的:它没有被解雇,因为我们没有对listener.onRequestClick()进行任何调用。

所以在你的actionPerformed中添加listener.onRequestClick(s1.getText());因此,在您的主要内容中,您将获得ebemt和文本。

答案 1 :(得分:1)

GUI替换为JOptionPane.showInputDialog(..),不仅代码会缩短很多,而且问题也会得到解决。 E.G。

import javax.swing.*;

class UserInput {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                String name = JOptionPane.showInputDialog(null, "Name?");
                if (name==null) {
                    System.out.println("Please input a name!");
                } else {
                    System.out.println("Name: " + name);
                }
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

答案 2 :(得分:0)

您可以使用回调机制

我已在此处发布了示例代码JFrame in separate class, what about the ActionListener?。请看看。

interface Callback {
    void execute(String value);
}

abstract class GUI extends JFrame implements ActionListener, Callback{
     ...
     // do not provide the implementation of `execute` method here

     ...
     public void actionPerformed(ActionEvent e) {
        s1 = t1.getText();
        // now callback method is called
        execute(s1);
     }
}

您的主要课程将如下:

public static void main(String args[]) {
    gui = new GUI() {

        @Override
        public void execute(String value) {
            System.out.println("Entered value:" + value);
        }
    };
}