在JavaFX中调用swing软件的主要功能将终止JavaFX软件
问题描述:
当我尝试在JavaFX程序中调用swing程序的main function
时,swing程序正常运行。但是当我试图关闭swing程序时,JavaFx程序也会终止。什么原因?我该如何解决它?在JavaFX中调用swing软件的主要功能将终止JavaFX软件
这是JavaFX的程序代码:
private void initStartGameButton() {
startButton.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if(!isPosValid()){
return;
}
String[] args = {"" + axePositionX, "" + axePositionY, "" + boatPositionX, "" + boatPositionY};
Game.main(args);
}
});
}
这是摆程序代码:
// The entry point of the game.
// This class loads up a JFrame window and
// puts a GamePanel into it.
package com.neet.DiamondHunter.Main;
import javax.swing.JFrame;
public class Game {
public static String[] args;
public static void main(String[] args) {
//save the args list.
Game.args = args;
JFrame window = new JFrame("Diamond Hunter");
window.add(new GamePanel());
window.setResizable(false);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
答
此:
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
将导致JVM当窗口退出关闭。根据JFrame API:
EXIT_ON_CLOSE(在JFrame中定义):使用System exit方法退出应用程序。仅在应用程序中使用它。
相反设置默认关闭操作到别的东西,也许
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
%的API:
DISPOSE_ON_CLOSE(在WindowConstants中定义):自动隐藏和调用任何后处理框架已注册的WindowListener对象。
这将帮助清理和发布Swing使用的一些资源。
答
更换
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
与
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
还要注意的是,你违反了Swing's threading rules。操作处理程序的handle(...)
方法在JavaFX应用程序线程上执行,因此您在同一线程上执行Game.main(...)
。如文档所述,摆动JFrame
只能创建并显示在AWT事件调度线程上。你应该修改你的swing应用程序,以便它正确遵循Swing的线程规则:
public class Game {
public static String[] args;
public static void main(String[] args) {
//save the args list.
SwingUtilities.invokeLater(() -> {
Game.args = args;
JFrame window = new JFrame("Diamond Hunter");
window.add(new GamePanel());
window.setResizable(false);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
});
}
}
它确实有效,但每次我关闭Swing程序。有一个例外。例外在线程 “螺纹-5” 显示java.lang.NullPointerException \t在com.neet.DiamondHunter.Main.GamePanel.drawToScreen(GamePanel.java:117) \t在com.neet.DiamondHunter.Main.GamePanel.run(的GamePanel .java:77) \t at java.lang.Thread.run(Thread.java:745) – zhangzhimin
@zhangzhimin:这是一个完全不同的问题,你需要修复这个异常,就像其他的NullPointerException一样。 NullPointerExceptions的启发式几乎总是相同的:您应该批判性地读取异常的堆栈跟踪以找到发生错误的代码行,引发异常的行,然后仔细检查该行,找出哪个变量为空,然后跟踪回到你的代码,看看为什么。你会一次又一次遇到这些,相信我。 –