JPanel RemoveAll не избавляется от предыдущих компонентов

У меня есть приложение swing, в котором я показываю изображения в JPanel. Если приложение не может создать изображение, я хочу удалить предыдущий из JPanel и заменить его на JTextField и сообщение. Я могу добавить текстовое поле, но оно нарисовано поверх предыдущего содержимого, которое само является подклассом JPanel. Вот что у меня есть:

private void displayMessage(String message) {
  JTextField tf = new JTextField(message);
  cdPanel.removeAll();
  cdPanel.add(tf, BorderLayout.NORTH);//tried lots of variations, inc. no layout    
  cdPanel.validate();
}

Как я могу заставить cdPanel полностью перерисовать себя?

Ответ 1

Вы можете просто попробовать позвонить:

cdPanel.revalidate();
cdPanel.repaint();   // This is required in some cases

вместо

cdPanel.validate();

Ответ 2

Поскольку вы имеете дело с непредсказуемой задержкой, используйте SwingWorker для загрузки в фоновом режиме, как показано здесь. В примере используется pack(), чтобы изменить размер метки на изображение, но вы можете использовать сетку фиксированного размера и масштабировать изображения, как показано здесь .