【问题标题】:Look & Feel troubles on Ubuntu在 Ubuntu 上的外观和感觉问题
【发布时间】: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


【解决方案1】:

我很想深入调试它,但临近的最后期限迫使我安装 Oracle Java 包,它解决了这个问题。一个令人失望的答案,但它确实永久地解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多