В первом случае вы добавляете метку на панель, затем добавляете панель к рамке, а затем делаете рамку видимой.Когда фрейм становится видимым, вызывается менеджер макета, и все компоненты в кадре получают размер и расположение в соответствии с правилами менеджера макета.
Однако во втором случае вы пытаетесь добавитьпометка для видимого графического интерфейса.
setVisible(true);
//Does not correctly add label
mainPanel.testMethod();
Вы никогда не вызываете менеджер макета, поэтому размер компонента равен (0, 0), поэтому рисовать нечего.
При каждом добавлении (или удалить) компонент из видимого графического интерфейса, основная логика которого будет выглядеть следующим образом:
panel.add(...);
panel.revalidate(); // invokes the layout manager.
panel.repaint();
Так что в testMethod () вам всем нужно добавить revalidate () и repaint ().
.Я уверен, что метод вызывается при возникновении sysout
Другая проблема заключается в том, что ваш метод getMainPanel () не будет работать, поскольку у вас есть две ссылки на класс MainPanel:
private MainPanel mainPanel = new MainPanel(); // this is just sitting in memory
public AppFrame() {
...
add(new MainPanel(), BorderLayout.CENTER); // this is added to the frame.
Итак, вы вызываете метод testMethod () для панели, которая просто находится в памяти и не была добавлена в фрейм.
Избавьтесь от второго экземпляра вашего класса.То, что вы должны сделать, это:
private MainPanel mainPanel = new MainPanel();
public AppFrame() {
...
add(mainPanel, BorderLayout.CENTER);
он будет работать как положено.
Я нахожу это удивительным, потому что ваша панель использует GridBagLayout
, но выНикогда не указывайте GridBagConstraint
при добавлении метки.