我们有一个使用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.MetalLookAndFeel
,javax.swing.plaf.nimbus.NimbusLookAndFeel
或com.sun.java.swing.plaf.motif.MotifLookAndFeel
时工作。
我们可以做些什么来使它与GTKLookAndFeel
一起使用来设计我们在SwingNode
中的Swing组件?
你在正确的线程做什么呢? Swing代码需要在[EventQueue.invokeLater](http://docs.oracle.com/javase/8/docs/api/java/awt/EventQueue.html#invokeLater-java.lang.Runnable-)中运行。 – VGR
@VGR:之前没有这样做,现在改变了它,但仍然没有改变行为。仍冻结应用程序。 –
尝试在命令行上运行它,并转储所有线程堆栈。在Windows上,这是通过Ctrl-Break完成的;在其他系统上,SIGQUIT可以完成,使用Ctrl- \或单独的'kill -3'命令完成。其中一个堆栈轨迹应指示setLookAndFeel卡在哪里。 – VGR