Недавно я спросил здесь, как добавить новый 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();
}
});
}
};
Самый простой способ удалить компонент (панель) из контейнера (фрейма) - сохранить ссылку на него, а затем вызвать 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 ' Я тестировал этот код, но он должен работать.
Роман, проблему можно решить следующим образом:
run
: final JPanel partnerSelectionPanel = generatePartnerSelectionPanel ();
frame.getContentPane (). Add (partnerSelectionPanel);
partnerSelectionPanel.setVisible (false);
Это работает. Я не знаю, является ли это безопасным и / или элегантным решением, но оно работает.
Это то же самое, добавляете ли вы или удаляете компонент в видимом графическом интерфейсе:
panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();