Как Swing обрабатывает последовательные изменения одного и того же компонента? - PullRequest
1 голос
/ 18 сентября 2009

Я немного запутался в модели рисования Swing.

Предположим, у меня есть комп JComponent, и я делаю что-то вроде:

c.setBackground(Color.RED);
c.setBackground(Color.YELLOW);

Очевидно, что конечным результатом является желтый цвет.

Как Swing справляется с этим?

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

Если бы я выполнял это вне потока событий Swing, я бы предположил, что в большинстве случаев (хотя условие гонки возможно), к тому времени, когда Swing EDT посещает свойство, уже имеет желтый цвет, поэтому никогда не краснеть.

Однако, насколько я понимаю, я должен делать эти вызовы из Runnable в Swing EDT. Это верно? В таком случае может показаться, что EDT должен был бы полностью выполнить каждое изменение без каких-либо «заглядываний»?

Ответы [ 2 ]

4 голосов
/ 18 сентября 2009

Область окна помечается грязной сразу. Запрос краски позже вернется на EDT. ОС или механизм очереди событий (или даже компонент) могут объединять события перерисовки (строго качество реализации, но на практике перерисовки в том же окне будут объединены, даже если они не пересекаются).

Методы для компонентов Swing должны вызываться в EDT. Поток отправки событий принадлежит AWT, а не Swing.

2 голосов
/ 18 сентября 2009

Прежде всего, вы не должны делать такие звонки за пределами EDT. Результаты могут быть непредсказуемыми. Поскольку все компоненты Swing имеют двойную буферизацию, вы не увидите мерцания при этом. Кроме того, по возможности все последовательные запросы на перерисовку объединяются в один.

В целом, вы не должны видеть никаких проблем при выполнении этого, пока это делается на EDT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...