Java 让JFrame GUI等待,然后在按下按钮后继续
我有一个扩展JFrame的gui类MyGUIClass。我想用java完成以下工作。我查看了EventQueue,但不知怎么的,我没能把事情做好。我甚至不确定这是不是正确的方法 总的来说,我想了解以下事件的顺序: ->启动JFrame ->保持JFrame处于活动状态,并等待直到按下播放按钮。按下按钮时 ->在main中执行其余的代码,但保持gui活动以接收来自JFrame的命令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
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)
在关闭之前不会继续。这是一个主窗口。谢谢你的评论。这是一个主窗口。谢谢你的评论。