我正在编写一个应用程序,需要一些小部件来使用不同的外观和感觉。该应用程序的其余部分使用系统外观&感觉。
我的方法是在初始化应用程序以交换所需的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
使用Metal感觉,生成的窗口是
交换GTK的感觉,
我已经玩了一段时间了,没有结果。有什么我想念的吗?任何人都可以重现这一点,如果是这样,它是Java发行版或我的代码中的错误吗?有没有更好的方法来实现我的目标?
答案 0 :(得分:0)
我本来希望深入调试这个,但是接近截止日期迫使我安装Oracle Java软件包,这解决了这个问题。这是一个令人失望的答案,但它确实永久地解决了这个问题。