在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使用的一些资源。

+0

它确实有效,但每次我关闭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

+0

@zhangzhimin:这是一个完全不同的问题,你需要修复这个异常,就像其他的NullPointerException一样。 NullPointerExceptions的启发式几乎总是相同的:您应该批判性地读取异常的堆栈跟踪以找到发生错误的代码行,引发异常的行,然后仔细检查该行,找出哪个变量为空,然后跟踪回到你的代码,看看为什么。你会一次又一次遇到这些,相信我。 –

更换

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); 
     }); 
    } 

}