2016-03-02 4 views
0

У меня есть 2 класса, MainClass и AdminPage. AdminPage состоит только из JLabel с текстом AdminPage. Я использую Nimbus Look & Feel.Почему создается статический класс, изменяющий шрифт и цвет фона?

Если я создаю новый AdminPage и поместить его в MainClass это выглядит следующим образом:

AdminPage adminPage = new AdminPage();

without_static

Но если изменить модификатор AdminPage к static, шрифт становится жирным шрифтом и фоном:

static AdminPage adminPage = new AdminPage();

with_static

Я действительно не понимаю, почему это происходит. Это не вызывает у меня никаких проблем, но много путаницы. Я полагаю, что это имеет отношение к тому, как 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.

+1

Хорошо, что вы используете EventQueue.invokeLater, чтобы правильно выполнить весь ваш код Swing в потоке отправки событий AWT. Однако, если вы сделаете свое поле статическим, оно создается за пределами потока отправки событий AWT, и вам следует ожидать странного поведения. – VGR

+0

Так что я не должен статично ставить «AdminPage»? Или какие другие способы изменить это поведение? – hamena314

+0

Правильно, не делайте его статичным вообще. – VGR

ответ

2

Вы установите Look & Почувствуйте, как создается экземпляр AdminPage, поэтому к нему не применяется. Look Look & Чувство не изменяется для всех существующих экземпляров пользовательского интерфейса при настройке в UIManager. Поскольку вы устанавливаете AdminPage в static, он создается при загрузке класса и до того, как выполняется main.

+0

Это имеет смысл! Каковы варианты жесткой работы с этой ситуацией? Как-то «откладывает» экземпляр класса, поэтому L & F применяется? Или вообще не создавайте экземпляр класса? – hamena314

+0

Самым простым было бы установить статику L & F, так что это первое, что было сделано. Со статическим инициализатором, например, –

+0

Я попытался установить L & F статическим способом, но он не работает (см. Мое редактирование, пожалуйста). – hamena314

1

Если для переменной AdminPage задан статический модификатор, конструктор AdminPage будет выполнен во время статической фазы инициализации вашего MainClass.

Это означает, что он является exected перед основным методом и особенно перед этой линией: применит

UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 

Таким образом, другие выглядеть и чувствовать себя по умолчанию.