Как я могу удалить JPanel из JFrame?

Недавно я спросил здесь, как добавить новый JPanel к JFrame. Ответ помог мне получить рабочий код. Но не у меня есть связанный вопрос: "Как я могу удалить старый JPanel". Мне нужно это из-за следующей проблемы.

Новый JPanel появляется, появляется, когда я хочу (или ограничение по времени, превышен или пользовательское нажатие кнопка "Submit"). Но за несколько секунд некоторый элемент старого JPanel появляется вместе с компонентом нового JPanel. Я не понимаю, почему это происходит.

Я думал, что это - потому что я имею к другим потокам, которые обновляют окно. Но первый поток просто добавляет старую панель однажды (так, это должно быть закончено). И во втором потоке у меня есть цикл, который повреждается (так, он также должен быть закончен).

Вот мой код:

private Thread controller = new Thread() {
    public void run() {
        // First we set the initial pane (for the selection of partner).
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().add(generatePartnerSelectionPanel());
                frame.invalidate();
                frame.validate();
            }
        });
        // Update the pane for the selection of the parnter.
        for (int i=40; i>0; i=i-1) {
            final int sec = i;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    timeLeftLabel.setText(sec + " seconds left.");
                }
            });
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { }

            if (partnerSubmitted) {
                break;
            }
        }
        // For the given user the selection phase is finished (either the time is over or form was submitted).
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().add(generateWaitForGamePanel());
                frame.invalidate();
                frame.validate();
            }
        });

    }
};

9
задан Community 23 May 2017 в 12:10
поделиться

3 ответа

Самый простой способ удалить компонент (панель) из контейнера (фрейма) - сохранить ссылку на него, а затем вызвать Container.remove (Component) , то есть:

private Thread controller = new Thread() {
public void run() {

        final Component panel1 = generatePartnerSelectionPanel();

        // First we set the initial pane (for the selection of partner).
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().add(panel1);
                frame.invalidate();
                frame.validate();
        }
        });
        // Update the pane for the selection of the parnter.
        for (int i=40; i>0; i=i-1) {
            final int sec = i;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    timeLeftLabel.setText(sec + " seconds left.");
                }
            });
            try {Thread.sleep(1000);} catch (InterruptedException e) {}
            if (partnerSubmitted) {break;}
        }
        // For the given user the selection phase is finished (either the time is over or form was submitted).
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().remove(panel1);
                frame.getContentPane().add(generateWaitForGamePanel());
                frame.invalidate();
                frame.validate();
        }
        });

}
};

i haven ' Я тестировал этот код, но он должен работать.

7
ответ дан 4 December 2019 в 13:01
поделиться

Роман, проблему можно решить следующим образом:

  1. Сделайте это в начале вашего метода run :

final JPanel partnerSelectionPanel = generatePartnerSelectionPanel ();

  1. Затем сделайте это

frame.getContentPane (). Add (partnerSelectionPanel);

  1. Перед добавлением новой панели сделайте следующее:

partnerSelectionPanel.setVisible (false);

Это работает. Я не знаю, является ли это безопасным и / или элегантным решением, но оно работает.

0
ответ дан 4 December 2019 в 13:01
поделиться

Это то же самое, добавляете ли вы или удаляете компонент в видимом графическом интерфейсе:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();
8
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: