【发布时间】:2017-10-02 21:11:24
【问题描述】:
我们有一个使用 Swing 的 Java 应用程序,但我们正在将其迁移到 JavaFX。因此,我们将旧的 Swing 代码包装到 SwingNodes 中,并逐步替换它们。
在迁移之前,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 一起工作以在SwingNodes 中设置我们的 Swing 组件的样式?
【问题讨论】:
-
您是否在正确的线程中进行操作? Swing 代码需要在EventQueue.invokeLater 内运行。
-
尝试在命令行上运行它,并转储所有线程堆栈。在 Windows 上,这是通过 Ctrl-Break 完成的;在其他系统上,SIGQUIT 会执行此操作,使用 Ctrl-\ 或单独的
kill -3命令完成。堆栈跟踪之一应指示 setLookAndFeel 卡住的位置。 -
@VGR: 运行外观设置的线程似乎卡在
com.sun.java.swing.plaf.gtk.GTKEngine.native_get_gtk_setting(Native Method)... 使用线程转储和 Eclipse 调试器对此进行了测试。 -
你也可以用
jstack -l提供一个线程转储,它会告诉你是否有死锁。你们提到线程卡在native_get_gtk_setting,并且这个方法是同步的,所以可能另一个线程正在持有锁。这可能会发生,因为 Swing 和 JavaFX 都有自己的线程...... -
对不起@MarkusWeninger,这是我唯一能想到的建议,我不知道现在还有什么可以尝试的。
标签: java swing javafx gtk look-and-feel