Java Swing: repaint() vs invalidate

Возможный дубликат:
Java Swing revalidate() vs repaint()

Привет всем

Я борюсь с моей программой, чтобы обновить ее в нужное время.

И не имея большого успеха lol

У меня есть 2 вопроса

Q1: что я должен использовать, когда мой интерфейс изменился: перерисовать или сделать недействительным?

Q2: когда они должны быть вызваны? Я знаю, что это звучит глупо, но на самом деле у меня проблемы с SwingWorker и другими потоковыми операциями.

Ответы

Ответ 1

Q1: что я должен использовать, когда мой интерфейс изменился: перерисовать или недействительным?

Если макет не обновлен из-за изменения размера, изменения шрифта и т.д., тогда вы должны вызвать invalidate. Недействительность компонента, недействительность компонента и всех родителей над ним, отмечены как необходимо, чтобы их разложили. До рисования на шаге валидации, если изменения не найдены, шаг рисования не учитывается.

Если какая-то часть компонента, который обновляется (определяется прямоугольником графического клипа, называемым "поврежденным" ), вам следует рассмотреть возможность переименования. Одна из причин, по которым могут возникнуть поврежденные области, - это перекрытие части вашего компонента из-за какого-либо другого компонента или приложения. По моему опыту, repaint() более эффективен, если вы вызываете его на самом внутреннем охватывающем компоненте (т.е. Используя public void repaint(int x, int y, int width, int height), а не используя public void repaint()).

Q2: когда они должны быть вызваны?

Invalidate(): отмечает, что компонент недействителен - это означает, что его макет больше или не может быть "обновлен": т.е. изменяется размер компонента, добавляется граница, изменяется шрифт и т.д., вы должны никогда не нужно вызывать invalidate() вручную, так как swing делает это для вас почти для каждого изменения свойств.

Если требуется перекрасить несколько областей внутри элемента управления, Invalidate приведет к перекрашиванию всего окна за один проход, избегая мерцания, вызванного избыточными рецензиями. Нет штрафа за исполнение при вызове Invalidate несколько раз до того, как элемент управления будет перекрашен.

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

Также посмотрите на метод Update.

ПРИМЕЧАНИЕ. Swing обрабатывает "перерисовки" запросов несколько иначе, чем AWT, хотя конечный результат для прикладного программиста по существу тот же самый - paint() вызывается.

Обратитесь к приведенной ниже ссылке, чтобы получить отличную ссылку о том, как выполняется рисование в AWT и Swing:

http://www.oracle.com/technetwork/java/painting-140037.html

Надеюсь, это поможет.