我有一个扩展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的推荐。
答案 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将坐在那里等待用户生成更多事件。