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,但似乎不起作用(请参见我的编辑)。