我有一个JButton,它有一个重写的actionPerformed(event)函数,如下所示:public void actionPerformed(ActionEvent event) {
try {
System.out.println("enters here");
Process p = Runtime.getRuntime().exec("python tetris.py");
} catch (Exception ex) {
System.err.println("error");
}
}
这段代码的问题在于,Python子进程在Java程序执行时开始,因此子进程的控制台(本应显示为全屏)被缩小到更小的大小。所以我决定在执行后续进程之前终止Java程序:
^{pr2}$
这带来了一个更新的问题——尽管随后的进程显示为全屏显示,因为Java程序在之前终止俄罗斯方块.py完全执行时,两个进程之间存在延迟,导致桌面内容在之前闪烁一秒钟俄罗斯方块.py开始奔跑。此时,我使用了waitFor():public void actionPerformed(ActionEvent event) {
try {
System.out.println("enters here");
Process p = Runtime.getRuntime().exec("python tetris.py");
p.waitFor();
System.exit(0);
} catch (Exception ex) {
System.err.println("error");
}
}
事实证明,waitFor()等待子进程终止,这与第一个场景中的问题相同,即子进程控制台的大小缩小。在
我的目标是:或者找到子进程在全屏模式下执行的方法(它自己执行)。
如果子进程正确执行,父进程(Java程序)可以终止,但是我需要消除两个进程之间的延迟。
我更喜欢终止Java程序,因为当我用JPanel从它的子进程切换回它自己的进程时,所有jbutton的位置都会混乱,因此无论如何都需要新的执行。如有任何意见,我们将不胜感激。在
更新:
劳恩的建议并不完全有效,因为ProcessBuilder似乎只要点击JButton就生效了,但我从中得到了一个想法。我没有检查子进程的状态,而是让Java进程休眠一段时间(实验值介于Python程序在较小窗口中执行和Java程序过早终止以产生长时间延迟之间)。在public void actionPerformed(ActionEvent event) {
try {
ProcessBuilder pb = new ProcessBuilder("python", "tetris.py");
Process p = pb.start();
Thread.sleep(300); // less than 315 ~ 320 transition
System.exit(0);
} catch (Exception ex) {
System.err.println("error");
}
}
然而,无论我使用了什么价值观,我都不能完美地实现转换,桌面内容会短暂地闪烁,但延迟比以前缩短了。为了进一步抵消这一点,我考虑将桌面设置为黑色,使其看起来没有显示任何内容,但这显然不是一种闲置的方法-它取决于处理器的性能,因此具有较差的可移植性,更不用说这并不能真正解决问题。如有进一步的建议,我们将不胜感激。在