为什么要使 class 静态更改字体和背景颜色?

Why is making a class static changing the font and background color?

我有 2 个 class,一个 MainClass 和一个 AdminPageAdminPage 仅由 JLabel 和文本 AdminPage 组成。我使用 Nimbus Look & Feel.

如果我创建一个新的 AdminPage 并将其放入 MainClass,它看起来像这样:

AdminPage adminPage = new AdminPage();

但是如果我把AdminPage的修饰符改成static,字体会变粗,背景也会变:

static AdminPage adminPage = new AdminPage();

我真的不明白为什么会这样。这没有给我带来任何问题,但带来了很多混乱。我想这与 UIManager 设置外观的方式有关,但我无法查明确切原因。

如有解释,将不胜感激!


这是我的 mcve-代码:

MainClass.java:

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import net.miginfocom.swing.MigLayout;

public class MainClass extends JFrame {
    private static final long serialVersionUID = 1L;

    JPanel centerPanel = new JPanel();
    AdminPage adminPage = new AdminPage();

    public MainClass() {
        setBounds(300, 50, 300, 300);
        setLayout(new MigLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        centerPanel.setLayout(new MigLayout());
        centerPanel.add(adminPage);
        add(centerPanel, "growx, wrap");
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

                    MainClass window = new MainClass();
                    window.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

AdminPage.java:

import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;

public class AdminPage extends JPanel {
    private static final long serialVersionUID = 1L;

    JPanel contentPanel = new JPanel();
    JLabel testLabel = new JLabel("Adminpage");

    public AdminPage() {
        setLayout(new MigLayout());
        contentPanel.setLayout(new MigLayout());

        contentPanel.add(testLabel);
        add(contentPanel);
    }
}

编辑:

感谢 我尝试以静态方式初始化 UIManager:

static {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    }
    catch (Exception ex) {
    }
}

但是我的 class 仍然没有使用预期的 L&F。

您在 AdminPage 实例化后设置外观,这就是为什么不应用于它的原因。在 UIManager 中设置时,所有现有 UI 实例的外观不会更改。由于您将 AdminPage 设置为静态,因此它在 class 加载时和执行 main 之前实例化。

如果您的 AdminPage 变量设置为静态修饰符,AdminPage 构造函数将在 MainClass 的静态初始化阶段执行。

这意味着它在 main 方法之前执行,尤其是在这一行之前:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

因此,将应用其他外观默认值。