外观和感受Ubuntu的麻烦

时间:2014-04-26 02:15:42

标签: java swing ubuntu look-and-feel

我正在编写一个应用程序,需要一些小部件来使用不同的外观和感觉。该应用程序的其余部分使用系统外观&感觉。

我的方法是在初始化应用程序以交换所需的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感觉,生成的窗口是

with metal feel

交换GTK的感觉,

GTK feel overriding

我已经玩了一段时间了,没有结果。有什么我想念的吗?任何人都可以重现这一点,如果是这样,它是Java发行版或我的代码中的错误吗?有没有更好的方法来实现我的目标?

1 个答案:

答案 0 :(得分:0)

我本来希望深入调试这个,但是接近截止日期迫使我安装Oracle Java软件包,这解决了这个问题。这是一个令人失望的答案,但它确实永久地解决了这个问题。