Вопрос по java, swing – Java Swing revalidate () против repaint ()

202

Я собираю приложение Swing, в котором часто хочу заменить содержимое JPanel. Для этого я звонюremoveAll(), затем добавив мой новый контент, затем позвонивrevalidate().

Однако я обнаружил, что старый контент все еще действительно виден (хотя и скрыт новым). Если я добавлю звонок вrepaint() в дополнение кrevalidate()работает как положено.

Я уверен, что в других случаях я слышал, что просто звонюrevalidate() достаточно.

Итак, в основном мой вопрос - мне нужно вызывать обе функции, а если нет, то когда мне следует вызывать каждую из них?

This tutorial from Oracle состояния: & quot; Всегда вызывать repaint после повторной проверки & quot ;. Никаких объяснений не приводится. mins

Ваш Ответ

5   ответов
81

когда вы делаете remove () или removeAll (), вы должны вызывать

  validate();
  repaint();

после того, как вы завершили добавление () новых компонентов.

Вызов validate () или revalidate () является обязательным, когда вы выполняете remove () - см. Соответствующие javadocs.

Мое собственное тестирование показывает, что repaint () также необходим. Я не совсем уверен, почему.

57

revalidate вызывается для контейнера после добавления новых компонентов или удаления старых. этот вызов является инструкцией, чтобы сказать менеджеру макета выполнить сброс на основе нового списка компонентов.revalidate вызовет перерисовку того, что компонент считает «грязными областями». Очевидно, не все регионы на вашемJPanel считаются грязнымиRepaintManager.

repaint используется, чтобы сказать компоненту перекрасить себя. Часто бывает так, что вам нужно позвонить, чтобы исправить такие условия, как у вас.

151

repaint() а такжеrevalidate(), Первый говорит Swing, что область окна грязная (что необходимо, чтобы стереть изображение старых детей, удаленныхremoveAll()); последний говорит менеджеру макета пересчитать макет (что необходимо при добавлении компонентов). Это должно вызватьchildren панели перекрасить, но может не вызвать саму панель (см.этот для списка триггеров перекраски).

На более общем замечании: вместо повторного использования исходной панели я рекомендую создать новую панель и поменять их местами на родительской.

Не могли бы вы объяснить, почему создание новой панели является лучшим решением, чем использование старой? :)
@Arttu - это меньше работы и, следовательно, меньше подвержено ошибкам.
-4

    перекрасить ();     перепроверить (); когда вы вызываете removeAll (), тогда вы должны вызвать repaint () и revalidate ()

И это отличается от принятого ответа, как? William
2

revalidate() просто запросить макет контейнера, когда вы испытали, просто позвонитеrevalidate() работает, это может быть вызвано обновлением границ дочерних компонентов запускаетrepaint() когда их границы изменяются во время перепланировки. В упомянутом выше случае только компонент удален и границы компонента не изменены, в этом случае нетrepaint() является"accidentally" срабатывает.

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