Добавление нового метода JLabel через вызываемый из другого класса - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь добавить новую JLabel в JPanel с помощью метода, вызванного в другом классе.

Класс 1:

public class AppFrame extends JFrame {
// CardGame
//Making private objects to access?\
private MainPanel mainPanel = new MainPanel();

public AppFrame() {
    super("BlackJack Cardgame");
    setBounds(100, 100, 640, 640);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    add(new StatusBar(), BorderLayout.SOUTH);
    add(new MainPanel(), BorderLayout.CENTER);
    add(new StatusBar(), BorderLayout.NORTH);
    setVisible(true);
    //Does not correctly add label
    mainPanel.testMethod();
}
public MainPanel getMainPanel() {
    return mainPanel;
}

Класс 2:

public class MainPanel extends JPanel {
Border blackBorder = BorderFactory.createLineBorder(Color.BLACK);
GridBagConstraints gbc = new GridBagConstraints();  

public void testMethod() {
    System.out.println("test method");
    this.add(new JLabel("test"));
}

public MainPanel() {
    setLayout(new GridBagLayout());
    ImageIcon icon = new ImageIcon(getClass().getResource("/images/ACE_CLUBS.jpg"));
    gbc.gridx = 0;
    gbc.gridy = 0;
    add(new JLabel(icon),gbc);
    ImageIcon icon2 = new ImageIcon(getClass().getResource("/images/TWO_CLUBS.jpg"));
    gbc.gridx = 1;
    gbc.gridy = 0;
    add(new JLabel(icon2),gbc);
    gbc.gridx=0;
    gbc.gridy=1;
    //correctly  adds label.
    testMethod();

}

Если метод вызывается из класса 2 (фрейм, в который я хочу добавить вещи), он будет работать как положено.Однако, если я попытаюсь вызвать метод из класса 1, он не добавит метку.Я уверен, что метод вызывается, когда происходит sysout.Мое понимание добавления вещей не правильно?

1 Ответ

0 голосов
/ 21 сентября 2018

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

Однако во втором случае вы пытаетесь добавитьпометка для видимого графического интерфейса.

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 при добавлении метки.

...