为什么要使 class 静态更改字体和背景颜色?
Why is making a class static changing the font and background color?
我有 2 个 class,一个 MainClass
和一个 AdminPage
。 AdminPage
仅由 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");
因此,将应用其他外观默认值。
我有 2 个 class,一个 MainClass
和一个 AdminPage
。 AdminPage
仅由 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");
因此,将应用其他外观默认值。