2013-01-15 3 views
5

Я пытаюсь понять, когда использовать revalidate/repaint/pack.Цикл обновления качания

Удивительно, но я не нашел подробной документации под капотом (не стесняйтесь ссылаться).

До сих пор я понял, что это все ответственность RepaintManager.

  • краска/перекрашивать см, что видит, как грязный/чистый
  • пакет/проверки/перепроверки см, что является действительным

This article on Oracle объясняет, что вызов перерисовки ставит в очередь на работу на Event Dispatcher Thread что в свою очередь вызовет paintImmediately() на компоненте (это перерисовывает компонент).

This trail указывает, что быть или не быть действительным связано с LayoutManager. И это касается размера компонента, а не контента.

  1. Правда ли, что вы должны переустановить, когда вы перемещаете/изменяете размер своего компонента и перерисовываете его при изменении его содержимого?
  2. Действительно ли метод pack() - это устаревшая вещь, которую вы никогда не должны звонить?
  3. Являются ли какие-либо из вышеуказанных утверждений неправильными?

ответ

6

Вот несколько основных случаев, когда вам нужно вызвать эти методы (я освещаю основы, но, возможно, я пропустил несколько других случаев, когда требуется вызвать эти методы).

  1. Вы должны вызвать revalidate() на контейнер, когда вы либо: добавлены один или более компонент, удален один или несколько компонентов, изменил ограничения одного или более Содержатся компоненты (ограничения или XXXSize(), хотя последнее не рекомендуется), изменил контейнер LayoutManager.
  2. Вы должны позвонить по номеру repaint(), если хотите, чтобы этот компонент (и его потомки) был перекрашен. В конце концов, это будет вызывать paintComponent() (для базовых виджетов это будет делегировать XXXUI.paint()), paintBorder() и paintChildren() (по крайней мере, в свинг)
  3. pack() фактически устанавливает размер окна до его предпочтительного размера. Обычно вы должны позвонить это право, прежде чем сделать окно видимым. Вы можете назвать это позже, но это даст странный пользовательский опыт (я не знаю, что многие приложения, изменять размер окна, как только на экране)

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

+0

Не могли бы вы определить краску с точки зрения изменений, которые она подразумевает? Я начинаю сомневаться, что полностью понимаю, что это значит. – kotoko

+1

@kotoko Я не уверен, что получаю, какой ответ вы ищете (ответьте на ваш комментарий). Когда вы рисуете (реализация метода 'paintComponent()'), это означает, что вы рисуете линии, круги (заполненные или нет), прямоугольники (заполненные или нет), изображения, текст и т. Д. (Все операции, которые вы можете фактически вызывать на «Graphics/Graphics2D»). –

+0

Я пытался понять, какие методы срабатывают.Теперь я получаю это (эмпирическое правило): действие, связанное с компоновкой/компонентом, влияет на действительность (ваш 1.); Графические/графические операции 2D влияют, если они грязные. – kotoko

Смежные вопросы