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

时间:2016-05-17 06:45:57

标签: java swing events awt

我有一个扩展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的推荐。

2 个答案:

答案 0 :(得分:2)

您必须在单击要为其执行某些代码的按钮上提供一个侦听器。

但是,如果您想将要执行的代码放在 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
       ...
    }

现在您可以从主

提供执行代码
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);
    }
});    

答案 1 :(得分:2)

  

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

如果这是主窗口或儿童窗口,那么你还没有说明。

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

如果这是"主窗口"那不是没有正确的方法。

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

因此,在创建框架时,您可以创建所有组件并将它们添加到框架中。

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

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