我有2个班级,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);
}
}
修改
感谢comment from Henning Luther我试图以静态方式初始化UIManager
:
static {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
}
catch (Exception ex) {
}
}
但是我的班级仍然没有使用预期的L& F.
答案 0 :(得分:2)
在AdminPage实例化后设置了外观,这就是为什么不应用它。在UIManager中进行设置时,不会更改所有现有UI实例的外观和感觉。由于您将AdminPage设置为static,因此在类加载时以及在执行main之前将其实例化。
答案 1 :(得分:1)
如果您的AdminPage变量设置为static修饰符,则AdminPage构造函数将在MainClass的静态初始化阶段执行。
这意味着它在main方法之前被执行,特别是在此行之前:
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
因此,其他外观默认将适用。