Java Swing revalidate () vs repaint()
Я собираю приложение Swing, где я часто хочу заменить содержимое JPanel. Для этого я звоню removeAll(), затем добавление моего нового контента, а затем вызов revalidate().
однако я нахожу, что старый контент все еще фактически виден (хотя и скрыт новым контентом). Если я добавлю вызов repaint() кроме revalidate(), он работает, как ожидалось.
Я уверен, что в других случаях я видел, что звоню revalidate() is достаточно.
Итак, в основном мой вопрос - Должен ли я вызывать обе функции, а если нет, то когда я должен вызывать каждую из них?
5 ответов:
нужно позвонить
repaint()иrevalidate(). Первый говорит Swing, что область окна грязная (что необходимо, чтобы стереть изображение старых детей, удаленныхremoveAll()); последний говорит менеджеру макета пересчитать макет (что необходимо при добавлении компонентов). Это должно вызвать дети панели для перекраски, но не может заставить саму панель сделать это (см. этой для списка триггеров перерисовки).на более общее Примечание: вместо повторного использования исходной панели я бы рекомендовал создать новую панель и поменять их на родительскую.
каждый раз, когда вы делаете remove() или removeAll (), вы должны вызвать
validate(); repaint();после завершения добавьте () ' ing новые компоненты.
вызов validate() или revalidate () является обязательным при выполнении remove () - см. соответствующие javadocs.
мое собственное тестирование показывает, что repaint() также необходимо. Я точно не знаю почему.
revalidateвызывается в контейнере после добавления новых компонентов или удаления старых. этот вызов является инструкцией, чтобы сказать менеджеру компоновки сбросить на основе нового списка компонентов.revalidateвызовет вызов для перерисовки того, что компонент считает "грязными областями".'Очевидно, не все регионы наJPanelсчитаются грязнымиRepaintManager.
repaintиспользуется для компонента обновления. Часто бывает, что нужно позвонить закажите условия очистки, такие как ваши.
revalidate()просто запросите макет контейнера, когда вы испытали просто вызовrevalidate()работает, это может быть вызвано обновлением дочерних компонентов bounds триггерыrepaint()когда их границы изменяются во время повторного макета. В случае, когда вы упомянули, удаляется только компонент и не изменяются границы компонентов, в этом случае нетrepaint()и "случайно" срабатывает.
да, вам нужно позвонить перекрасить(); подтвердить(); когда вы вызываете removeAll (), то вы должны вызвать repaint () и revalidate ()
Comments