2016-12-04 51 views
0

當我嘗試在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); 
    } 
} 

回答

1

此:

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的啓發式幾乎總是相同的:您應該批判性地讀取異常的堆棧跟蹤以找到發生錯誤的代碼行,引發異常的行,然後仔細檢查該行,找出哪個變量爲空,然後跟蹤回到你的代碼,看看爲什麼。你會一次又一次遇到這些,相信我。 –

2

更換

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

}