2017-05-04 98 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

之前尝试过,并且都不能解决问题。 –

相关问题