У меня есть 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);
}
}
EDIT:
Благодаря comment from Henning Luther я пытался инициализировать UIManager
в статическом виде:
static {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
}
catch (Exception ex) {
}
}
Но мой класс до сих пор не использует предполагаемый L & F.
Хорошо, что вы используете EventQueue.invokeLater, чтобы правильно выполнить весь ваш код Swing в потоке отправки событий AWT. Однако, если вы сделаете свое поле статическим, оно создается за пределами потока отправки событий AWT, и вам следует ожидать странного поведения. – VGR
Так что я не должен статично ставить «AdminPage»? Или какие другие способы изменить это поведение? – hamena314
Правильно, не делайте его статичным вообще. – VGR