Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让JFrame GUI等待,然后在按下按钮后继续_Java_Swing_Events_Awt - Fatal编程技术网

Java 让JFrame GUI等待,然后在按下按钮后继续

Java 让JFrame GUI等待,然后在按下按钮后继续,java,swing,events,awt,Java,Swing,Events,Awt,我有一个扩展JFrame的gui类MyGUIClass。我想用java完成以下工作。我查看了EventQueue,但不知怎么的,我没能把事情做好。我甚至不确定这是不是正确的方法 总的来说,我想了解以下事件的顺序: ->启动JFrame ->保持JFrame处于活动状态,并等待直到按下播放按钮。按下按钮时 ->在main中执行其余的代码,但保持gui活动以接收来自JFrame的命令 try { java.awt.EventQueue.invo

我有一个扩展JFrame的gui类MyGUIClass。我想用java完成以下工作。我查看了EventQueue,但不知怎么的,我没能把事情做好。我甚至不确定这是不是正确的方法

总的来说,我想了解以下事件的顺序:

->启动JFrame

->保持JFrame处于活动状态,并等待直到按下播放按钮。按下按钮时

->在main中执行其余的代码,但保持gui活动以接收来自JFrame的命令

            try {
                java.awt.EventQueue.invokeAndWait(new Runnable() {
                   public void run() {
                       new MyGUIClass().setVisible(true);
                   }
               });
            }
            catch (Exception e) {
                e.printStackTrace();
            }

            System.out.println("Portion to execute only after request from GUI");
            }

但是上面的试用版不起作用,当gui运行时,println会打印,而没有gui的任何推荐。

您必须提供一个监听器,以便在单击按钮时执行一些代码

但是如果您想将要执行的代码放入main。您将需要一些包含代码或lambda等的匿名类

我将在这里展示你如何实现你想要的

class MyGUIClass extends JFrame {
    ...
    // I am using Runnable to contain code you want to execute.
    // You can use Function or any class/interface you want
    Runnable codeToExecute;
    MyGUIClass(Runnable codeToExecute){
        this.codeToExecute = codeToExecute;
        ...
    }

    ...
    void yourGUImethod(){
        ...
        JButton btn = new JButton(new AbstractAction(){
            @Override
            public void actionPerformed(ActionEvent e) {
                codeToExecute.run();    // execute code on button press
            }
        });
        yourPanel.add(btn);             // Add this button to your panel
       ...
    }
现在您可以从main提供执行代码

Runnable codeToExecute = () -> {     // Using lambda
    System.out.println("Portion to execute only after request from GUI");
}

java.awt.EventQueue.invokeAndWait(new Runnable() {
    public void run() {
        new MyGUIClass(codeToExecute).setVisible(true);
    }
});    

您必须为要执行某些代码的按钮提供一个侦听器

但是如果您想将要执行的代码放入main。您将需要一些包含代码或lambda等的匿名类

我将在这里展示你如何实现你想要的

class MyGUIClass extends JFrame {
    ...
    // I am using Runnable to contain code you want to execute.
    // You can use Function or any class/interface you want
    Runnable codeToExecute;
    MyGUIClass(Runnable codeToExecute){
        this.codeToExecute = codeToExecute;
        ...
    }

    ...
    void yourGUImethod(){
        ...
        JButton btn = new JButton(new AbstractAction(){
            @Override
            public void actionPerformed(ActionEvent e) {
                codeToExecute.run();    // execute code on button press
            }
        });
        yourPanel.add(btn);             // Add this button to your panel
       ...
    }
现在您可以从main提供执行代码

Runnable codeToExecute = () -> {     // Using lambda
    System.out.println("Portion to execute only after request from GUI");
}

java.awt.EventQueue.invokeAndWait(new Runnable() {
    public void run() {
        new MyGUIClass(codeToExecute).setVisible(true);
    }
});    
我甚至不确定这是不是正确的方法

您还没有说明这是主窗口还是子窗口

如果这是一个“子窗口”,并且您正在主窗口中提示输入信息,那么您应该为子窗口使用模态JDialog

如果这是“主窗口”,那么不,这不是正确的方法

GUI是事件驱动的。这意味着您需要编写代码来响应事件

因此,创建框架后,您将创建所有组件并将它们添加到框架中

对于“播放”按钮,您需要向按钮添加ActionListener。因此,当按下按钮时,您将调用与播放操作相关的代码

然后GUI将坐在那里等待用户生成更多事件

我甚至不确定这是不是正确的方法

您还没有说明这是主窗口还是子窗口

如果这是一个“子窗口”,并且您正在主窗口中提示输入信息,那么您应该为子窗口使用模态JDialog

如果这是“主窗口”,那么不,这不是正确的方法

GUI是事件驱动的。这意味着您需要编写代码来响应事件

因此,创建框架后,您将创建所有组件并将它们添加到框架中

对于“播放”按钮,您需要向按钮添加ActionListener。因此,当按下按钮时,您将调用与播放操作相关的代码


然后GUI将坐在那里等待用户生成更多的事件。

请发布您的可运行示例,这样我们就可以运行它并查看出了什么问题。此外,您还应该阅读@SergiyMedvynskyy,谢谢您的评论。Runnable在上述代码中定义。您想让我发布MyGUIClass()?我想看一个简短的(大约50行代码)可编译和可运行的示例或,它演示了您的问题。您似乎需要一个模态
JDialog
而不是一个框架。
对话框之后的代码。setVisible(true)
在关闭之前不会继续。请发布您的可运行示例,以便我们可以运行它并查看错误。此外,您还应该阅读@SergiyMedvynskyy,谢谢您的评论。Runnable在上述代码中定义。您想让我发布MyGUIClass()?我想看一个简短的(大约50行代码)可编译和可运行的示例或,它演示了您的问题。您似乎需要一个模态
JDialog
而不是一个框架。
对话框之后的代码。setVisible(true)
在关闭之前不会继续。这是一个主窗口。谢谢你的评论。这是一个主窗口。谢谢你的评论。