как мне выбрать между JComponent.revalidate и Container.validate

#java #swing #layout

#java #swing #макет

Вопрос:

Я использую WindowBuilder и Swing. Я выполняю следующее на Swing JPanel:

 java.awt.Container.setLayout()
java.awt.Container.removeAll()
java.awt.Container.add()
  

Чтобы закончить, я вызываю:

java.awt.Container.validate() но я заметил, что javax.swing.JComponent.revalidate() на практике это, похоже, делает то же самое. Я не заметил никакой разницы в поведении. JPanel наследуется как от контейнера, так и от JComponent. Как мне выбрать между ними?

Ответ №1:

3 важных отличия:

  • JComponent#revalidate() сначала делает недействительным компонент, который Container#validate() не выполняется.
  • JComponent#revalidate() не выполняется немедленная проверка, он добавляет компонент в список недопустимых компонентов, и компоненты RepaintManager будут проверяться пакетами. Это может повысить производительность, когда требуется много проверок.
  • JComponent#revalidate() может вызываться из любого потока, а не только из потока отправки событий.

Если вам не нужен немедленный эффект (который необходим только в особых ситуациях), JComponent#revalidate() предпочтительнее.