我的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程序:
public void actionPerformed(ActionEvent event) {
try {
System.out.println("enters here");
Process p = Runtime.getRuntime().exec("python tetris.py");
System.exit(0);
} catch (Exception ex) {
System.err.println("error");
}
}
这提出了一个更新的问题 - 尽管后续进程确实显示为全屏,因为Java程序在tetris.py完全执行之前终止,两个进程之间存在延迟,导致桌面内容闪烁一秒在tetris.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的位置都搞砸了,因此无论如何都需要新的执行。任何投入都将受到赞赏。
更新
laune建议没有完全正常工作,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");
}
}
然而,无论我使用什么价值,我都无法完美地转换,桌面内容会短暂闪烁,但延迟比之前更短。为了进一步抵消这种情况,我想把桌面设置为黑色以使它看起来没有被显示,但这显然不是一种空闲的方法 - 它取决于处理器的性能,因此具有较差的可移植性,更不用说这不能提供问题的真正解决方案。任何进一步的指示将不胜感激。
答案 0 :(得分:0)
您可以尝试
ProcessBuilder pb = new ProcessBuilder("python", "tetris.py" );
Process p = pb.start();
while( ! p.isAlive() ){
Thread.sleep( 10 );
}
System.exit(0);
答案 1 :(得分:0)
您需要全屏,请使用setFullScreen全屏显示。尽量避免使用像你那样的解决方法。他们几乎总是会导致其他错误和变通办法,最终导致您的应用无法维护。
我无法测试它,但我希望它适合你。
此外,如果您真的必须按照自己的方式进行操作,则不应使用System.exit(0),而应使用Platform.exit()。