我有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。
最佳答案
在实例化AdminPage之后设置外观,这就是为什么不对其应用的原因。在UIManager中进行设置时,不会为所有现有的UI实例更改外观。因为您将AdminPage设置为static,所以它在类加载时和执行main之前实例化。