2017-05-04 63 views
35

我們有一個使用Swing的Java應用程序,但我們正在將它遷移到JavaFX。因此,我們將舊的Swing代碼包裝成SwingNode s,並逐步替換它們。嘗試使用GTKLookAndFeel設置JavaFX中的SwingNode的樣式凍結應用程序

在遷移之前,Swing應用程序使用com.sun.java.swing.plaf.gtk.GTKLookAndFeel作爲外觀(Ubuntu上的默認設置)。我們使用下面的代碼來設置它(如果可用):

for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
    if (info.getClassName().equals("com.sun.java.swing.plaf.gtk.GTKLookAndFeel")) { 
    UIManager.setLookAndFeel(info.getClassName()); 
    } 
} 

這工作正常。然而,在切換到JavaFX後,對UIManager.setLookAndFeel()的調用凍結了應用程序,並且什麼也沒有發生。由於我們仍然想要基於GTKLookAndFeel還未將樣式遷移到JavaFX的Swing組件,所以需要手動設置外觀。

進一步信息:這只是不com.sun.java.swing.plaf.gtk.GTKLookAndFeel工作,因爲它使用javax.swing.plaf.metal.MetalLookAndFeeljavax.swing.plaf.nimbus.NimbusLookAndFeelcom.sun.java.swing.plaf.motif.MotifLookAndFeel時工作。

我們可以做些什麼來使它與GTKLookAndFeel一起使用來設計我們在SwingNode中的Swing組件?

+1

你在正確的線程做什麼呢? Swing代碼需要在[EventQueue.invokeLater](http://docs.oracle.com/javase/8/docs/api/java/awt/EventQueue.html#invokeLater-java.lang.Runnable-)中運行。 – VGR

+0

@VGR:之前沒有這樣做,現在改變了它,但仍然沒有改變行爲。仍凍結應用程序。 –

+1

嘗試在命令行上運行它,並轉儲所有線程堆棧。在Windows上,這是通過Ctrl-Break完成的;在其他系統上,SIGQUIT可以完成,使用Ctrl- \或單獨的'kill -3'命令完成。其中一個堆棧軌跡應指示setLookAndFeel卡在哪裏。 – VGR

回答

-1

Gui組件需要更新到gui線程中。

請嘗試以下之一:

SwingUtilities.invokeLater(() -> { 
//commands 
}); 

javafx.application.Platform.runLater(() -> { 
//commands 
}); 
+0

之前嘗試過,並且都不能解決問題。 –