Java Swing revalidate () vs repaint()



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



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



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



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

626   5  

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

    Ничего не найдено.