尝试使用 GTKLookAndFeel 在 JavaFX 中设置 SwingNode 的样式会冻结应用程序

Posted

技术标签:

【中文标题】尝试使用 GTKLookAndFeel 在 JavaFX 中设置 SwingNode 的样式会冻结应用程序【英文标题】:Trying to style SwingNodes in JavaFX with GTKLookAndFeel freezes application 【发布时间】: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.MetalLookAndFeeljavax.swing.plaf.nimbus.NimbusLookAndFeelcom.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,这是我唯一能想到的建议,我不知道现在还有什么可以尝试的。 【参考方案1】:

GUI 组件需要更新到 gui 线程中。

尝试以下方法之一:

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

javafx.application.Platform.runLater(() -> 
//commands
);

【讨论】:

之前都试过了,都没有解决问题。

以上是关于尝试使用 GTKLookAndFeel 在 JavaFX 中设置 SwingNode 的样式会冻结应用程序的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 Intent 获取字符串时未设置 .child()

jav的流行型

jav的流行型

jav怎样实现对soapUI mockService功能的模拟,需要代码

使用mybatis报错constructor found in com.atguigu.mybatis.bean.Department matching [java.lang.Integer, jav

为啥弄不到jav的力量