Java 为什么让一个类静态更改字体和背景颜色?

Java 为什么让一个类静态更改字体和背景颜色?,java,static,look-and-feel,nimbus,Java,Static,Look And Feel,Nimbus,我有两个类,一个是MainClass,一个是AdminPage。AdminPage仅由一个JLabel和文本AdminPage组成。我使用的是Nimbus外观和感觉 如果我创建一个新的AdminPage,并将其放入MainClass中,它如下所示: AdminPage AdminPage=新建AdminPage() 但是,如果我将AdminPage的修饰符更改为static,则字体将变为粗体,背景将发生变化: static AdminPage AdminPage=new AdminPage()

我有两个类,一个是
MainClass
,一个是
AdminPage
AdminPage
仅由一个
JLabel
和文本
AdminPage
组成。我使用的是
Nimbus外观和感觉

如果我创建一个新的
AdminPage
,并将其放入
MainClass
中,它如下所示:

AdminPage AdminPage=新建AdminPage()

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

static AdminPage AdminPage=new AdminPage()

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

请解释


这是我的密码:

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();
                }
            }
        });
    }
}
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);
    }
}
AdminPage.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();
                }
            }
        });
    }
}
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);
    }
}
编辑:

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();
                }
            }
        });
    }
}
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);
    }
}
多亏了a,我尝试以静态方式初始化
UIManager

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

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

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

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

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

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

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

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

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

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

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

最好使用EventQueue.invokeLater,以便在AWT事件调度线程中正确执行所有Swing代码。但是,如果您将字段设置为静态,它将在AWT事件分派线程之外实例化,您应该会看到奇怪的行为?或者我必须用什么其他方法来改变这种行为?正确,不要让它成为静态的。最好使用EventQueue.invokeLater来正确执行AWT事件调度线程中的所有Swing代码。但是,如果您将字段设置为静态,它将在AWT事件分派线程之外实例化,您应该会看到奇怪的行为?或者我必须用什么其他方法来改变这种行为?正确,不要让它静止。这是有意义的!处理这种情况有哪些选择?以某种方式“推迟”类的实例化,以便应用L&F?或者根本不实例化这个类?最简单的方法是设置L&F静态,所以这是第一件要做的事情。以静态初始化器为例,我尝试以静态方式设置L&F,但似乎不起作用(请参见我的编辑)。这很有意义!处理这种情况有哪些选择?以某种方式“推迟”类的实例化,以便应用L&F?或者根本不实例化这个类?最简单的方法是设置L&F静态,所以这是第一件要做的事情。以静态初始化器为例,我尝试以静态方式设置L&F,但似乎不起作用(请参见我的编辑)。