如何在不重新启动应用程序的情况下更改Java Swing外观和感觉?

7

有没有一种特定的方法可以改变Swing应用程序的外观和感觉,而不需要在用户更改LAF时每次重新启动应用程序?

我正在寻找一种解决方案,可以从配置对话框中选择LAF,并在应用后直接更改其样式,而无需回退告诉用户重新启动应用程序。

目前,我会在启动之前记住选定的LAF并将其设置为任何窗口打开之前。


3
这个有用吗?http://stackoverflow.com/questions/2655929/lookandfeel-not-changing-in-ubuntu/2656085#2656085 - tim_yates
@tim_yates 实际上有时候并不是这样的。特别是监听器会以不同的顺序被触发,这本来不应该有影响,但通常会有。此外,我也不会完全相信 PL&F 的卸载(特别是如果没有使用 UIResource(因为它无法与某些类和基元一起使用),那么 PL&F 如何准确地检测应用程序代码是否对组件属性感兴趣?)。 - Tom Hawtin - tackline
@Tom 如果这不是一个太复杂的应用程序,并且除了进行完全重启(OP想要避免)之外,这是唯一可行的解决方案,那么它可能会起作用。 - tim_yates
@tim_yates 这个方法很有可能有效,但我不想依赖下一次更新让我难堪。如果这是一个写得很好的程序(!),清除界面、改变编程语言和框架,并重新创建界面应该不会太困难,而且不会有太多的变动。 - Tom Hawtin - tackline
@tim_yates 如果设置了自定义颜色和字体,则这些值应在updateUI()方法中重置。但通常情况下它应该可以工作。您可以在IntelliJ IDEA中更改L&F而无需重新启动,我不会说它是一个小应用程序。 - Denis Tulskiy
1个回答

5

来自Java教程:

首先需要通过调用UIManager.setLookAndFeel来设置新的外观和感觉:

UIManager.setLookAndFeel(lnfName);

接下来,为了使现有组件反映出新的外观和感觉,需要在每个顶层容器(对话框、框架等)上调用SwingUtilities.updateComponentTreeUI方法。您可能还希望调整每个顶层容器的大小以适应其包含组件大小的变化:

SwingUtilities.updateComponentTreeUI(frame);  // update components
frame.pack();                                 // adapt container size if required

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接