【问题标题】:How to pause program having main() until a button from GUI is pressed?如何暂停具有 main() 的程序,直到按下 GUI 中的按钮?
【发布时间】:2014-04-13 21:57:19
【问题描述】:

我是 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.
    }
}

图形界面

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

请指导我,如果问题不合适,请向我推荐您认为我应该阅读以了解概念的文章。

【问题讨论】:

  • 点击按钮后你想发生什么?
  • 另外,请使用一致的缩进重新格式化您的代码。它将帮助其他人能够阅读它。
  • @Code-Guru :单击按钮后,它应该将字符串存储在 s1(of GUI) 中,然后我想通过 obj.s1(from Client) 获取 s1 值。但问题是 obj.s1 的值是“”(正如我在 GUI 类中初始化的那样)。
  • 您需要一个阻塞函数......或回调,如下面的答案中所述。提示 - 使用 callcack,也就是事件处理程序。网络上有大量的阅读材料。甚至有这种关闭的东西的设计模式.... 四人帮。 Anywho - 在 Java 中查找回调和事件,这会让你到达你需要去的地方。

标签: java swing user-interface jframe actionlistener


【解决方案1】:

现在我在打电话,所以我无法帮你写代码.所以是的,你有时可以让 main 睡眠并希望输入,等到 .s1 得到一个值等等。

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

好吧,首先你声明一个接口可能命名为OnRequestClick,你在其中实现onRequestClick(String message);方法。

消息将是 s1 的文本。

现在在 GUI 类中创建一个名为侦听器的 OnRequestClick 类型的新字段,并将其放入构造函数中。

现在您在哪里创建 GUI 对象,编译器会要求您为 OnRequestClick 提供代码,请执行此操作,这将是用户按下按钮时将执行的代码。

好吧,现在我说的是错误的:它不会被触发,因为我们没有对 listener.onRequestClick () 进行任何调用

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以使用回调机制

      我已经在这里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);
              }
          };
      }
      

      【讨论】:

        猜你喜欢
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        相关资源
        最近更新 更多