【发布时间】:2014-04-26 02:15:41
【问题描述】:
我正在编写一个应用程序,它需要一些小部件来使用不同的外观和感觉。应用的其余部分使用系统外观。
我的方法是在初始化应用程序以将 LF 交换为所需的应用程序时,创建组件,然后重置 LF。这在 Windows 操作系统上运行良好,但在 Ubuntu 上对其进行测试时,它未能以一种奇怪的方式为组件设置 LF。
在 Ubuntu 上,UIManager.getSystemLookAndFeelClassName() 报告 LF 是 javax.swing.plaf.metal.MetalLookAndFeel。这是第一个麻烦 - 我希望它返回com.sun.java.swing.plaf.gtk.GTKLookAndFeel。奇怪的是,我的方法在程序使用 Metal LF 时有效,但在使用 GTK LF 时失败,它将整个框架和其中的所有组件设置为 GTK LF。
以下 SSCCE 演示了该问题:
import javax.swing.*;
import java.awt.*;
import static javax.swing.UIManager.*;
public class LaFTest {
public static void main(String[] argv) throws ReflectiveOperationException, UnsupportedLookAndFeelException {
String[] keys = {
"java.specification.version",
"java.version",
"java.vm.version",
"java.specification.vendor",
};
for (String key : keys) {
System.out.printf("%-40s%s\n", key, System.getProperty(key));
}
System.out.println(UIManager.getSystemLookAndFeelClassName());
// Swap for "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
JFrame frame = new JFrame("LaF Test");
Container content = frame.getContentPane();
content.setLayout(new GridLayout(2, 0));
JButton button = new JButton("System");
content.add(button);
LookAndFeel previous = getLookAndFeel();
for (LookAndFeelInfo feel : getInstalledLookAndFeels()) {
if (feel.getName().equals("Nimbus")) {
setLookAndFeel(feel.getClassName());
}
}
JButton second = new JButton("Nimbus");
content.add(second);
setLookAndFeel(previous);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
但请注意,我不确定此问题的可重复性。由于快速谷歌没有显示类似的问题,这可能是我的机器特有的问题。无论如何,当从 Ubuntu 12 更新到 13 和 13 到 14 时,它仍然存在。据此,我认为这是 Swing 的问题,而不是底层系统。
上面程序的输出是,在我的机器上,
java.specification.version 1.7
java.version 1.7.0_51
java.vm.version 24.51-b03
java.specification.vendor Oracle Corporation
javax.swing.plaf.metal.MetalLookAndFeel
使用金属感觉,生成的窗口是
换成 GTK 的感觉,
我已经玩了一段时间了,没有结果。有什么我想念的吗?任何人都可以重现这一点,如果是这样,它是 Java 发行版或我的代码中的错误吗?有没有更好的方法来实现我的目标?
【问题讨论】:
-
我不太明白你的问题。您想在一个面板上显示两个具有 2 种不同外观和感觉的按钮吗?我不认为这种方法是有意的(即使它可能有效)......
-
远射,但在 if (feel.getName().equals("Nimbus")) 内添加打印以确保 nimbus L&F 在 GTK 设置后可用。
标签: java swing ubuntu look-and-feel