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

时间:2016-03-02 10:08:13

标签: java static look-and-feel nimbus

我有2个班级,MainClassAdminPageAdminPage仅包含JLabel个文字AdminPage。我使用Nimbus Look & Feel

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

AdminPage adminPage = new AdminPage();

without_static

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

static AdminPage adminPage = new AdminPage();

with_static

我真的不明白为什么会这样。它给我带来了没有问题,但是很多混乱。我认为这与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.

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

这意味着它在main方法之前被执行,特别是在此行之前:

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

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