#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()
предпочтительнее.