我们有一个使用Swing的Java应用程序,但我们正在将其迁移到JavaFX。因此,我们将旧的Swing代码包装到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组件?
com.sun.java.swing.plaf.gtk.GTKEngine.native_get_gtk_setting(Native Method)
处卡住了...通过线程转储和Eclipse调试器进行了测试。 - Markus Weningerjstack -l
提供线程转储,它会显示是否存在死锁。你们提到线程在native_get_gtk_setting
中卡住了,并且这个方法是同步的,所以可能另一个线程正在持有锁。这可能是因为 Swing 和 JavaFX 各自拥有自己的线程... - Hugues M.