尝试使用 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 代码包装到 SwingNode
s 中,并逐步替换它们。
在迁移之前,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
s 中设置我们的 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怎样实现对soapUI mockService功能的模拟,需要代码
使用mybatis报错constructor found in com.atguigu.mybatis.bean.Department matching [java.lang.Integer, jav