我有2个课,分别是MainClassAdminPageAdminPage仅包含带有文本JLabelAdminPage。我使用Nimbus Look & Feel

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

AdminPage adminPage = new AdminPage();

java - 为什么要使类静态更改字体和背景颜色?-LMLPHP

但是,如果我将AdminPage的修饰符更改为static,则字体变为粗体,并且背景发生变化:

static AdminPage adminPage = new AdminPage();

java - 为什么要使类静态更改字体和背景颜色?-LMLPHP

我真的不明白为什么会这样。这不会给我带来任何问题,但会带来很多混乱。我想这与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);
    }
}


编辑:

感谢comment from Henning Luther,我尝试以静态方式初始化UIManager

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


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

最佳答案

在实例化AdminPage之后设置外观,这就是为什么不对其应用的原因。在UIManager中进行设置时,不会为所有现有的UI实例更改外观。因为您将AdminPage设置为static,所以它在类加载时和执行main之前实例化。

07-26 09:30