3

今天是个好日子。

首先:检查此图像。

请注意,在 3 个框架中的第一个框架中,按钮的样式为金属外观,但框架为 Windows 样式。在按钮 LAF 与帧 LAF 匹配的情况下,其他 2 个帧为“OK”。

所有这些的代码(与图像相同的顺序):

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {             
            JFrame frame = new JFrame();

            frame.getContentPane().add(new JButton("button"));
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    });
}

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {             
            JFrame frame = new JFrame();

            frame.setUndecorated(true);
            frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
            frame.setSize(100, 100); 

            frame.getContentPane().add(new JButton("button"));
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    });
}

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                // 0 => "javax.swing.plaf.metal.MetalLookAndFeel"
                // 3 => the Windows Look and Feel
                String name = UIManager.getInstalledLookAndFeels()[3].getClassName();
                UIManager.setLookAndFeel(name);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            
            JFrame frame = new JFrame();

            frame.getContentPane().add(new JButton("button"));
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    });
}

现在困扰我的是,我从未被迫使用 lines frame.setUndecorated(true); frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);,因为设置 Look and Feel 只是使用该UIManager.setLookAndFeel()方法。通常,JFrame 本身也会被设置样式,但这似乎不再是这样,因为我得到了一个 Windows 样式的框架(第一个图像,1 个代码片段)。

为什么是这样?这是 Java 7 中的新功能吗?这看起来真的很奇怪。

通常,在不涉及涉及外观的代码的情况下,程序应该以 Metal 外观开始,因为这是标准的 Java 外观。那么为什么第一个程序以 Windows 框架开头呢?

4

2 回答 2

6

在你初始化 JFrame 之前在你的 main 方法中添加这一行

JFrame.setDefaultLookAndFeelDecorated(true);

不久前,当我开始使用物质时,我注意到了同样的事情,但那条线就是修复它所需要的。

正如前面的代码片段所暗示的,您必须在创建要影响其装饰的框架之前调用 setDefaultLookAndFeelDecorated 方法。您使用 setDefaultLookAndFeelDecorated 设置的值用于所有随后创建的 JFrame。您可以通过调用 JFrame.setDefaultLookAndFeelDecorated(false) 切换回使用窗口系统装饰。有些外观和感觉可能不支持窗户装饰;在这种情况下,使用了窗口系统装饰。

那是来自Oracle的那行代码。

这是 Java 的一个特性,默认情况下 JFrame 窗口的边框不会被装饰,但是使用上面提到的功能可以让设置的外观和感觉来装饰窗口。据我所知,此功能是在 1.4 中实现的。

编辑:

此外,如果您想将您的自定义外观应用到 JDialog 窗口边框,您可以在 JDialog 类上使用您在 JFrame 上调用它的同一位置上的相同静态方法:

JDialog.setDefaultLookAndFeelDecorated(true);
于 2013-03-31T16:29:23.667 回答
0

我猜你没有设置swing.defaultlaf系统环境变量,但也许你可以检查你swing.properties是否存在以及它是否包含一个 entry swing.defaultlaf。这可能是原因,请参阅下面的 UIManager 如何选择 L&F。

显然,我的 MacBook 上有该文件,因为 Apple 希望 Apple L&F 成为默认设置。但是我还没有检查过Windows机器..

这是 Java 7 文档的摘录,自 Java 1.4 以来几乎没有变化。Java 1.4.2Java 1.5Java 6Java 7

默认外观

用于默认外观的类按以下方式选择:

  1. 如果系统属性swing.defaultlafnon-null,则使用其值作为默认外观类名称。
  2. 如果Properties文件swing.properties 存在并包含 key swing.defaultlaf,则使用其值作为默认外观类名称。检查的位置swing.properties可能因 Java 平台的实现而异。在 Sun 的实现中,位置是${java.home}/lib/swing.properties. 有关更多详细信息,请参阅正在使用的实现的发行说明。
  3. 否则使用跨平台外观。

于 2013-07-02T19:48:52.040 回答