Принудительное полное обновление Java-апплета (AWT)

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

Я пробовал вызывать различные комбинации paint () / repaint () / invalidate () / update () для родительских контейнеров и повторять для различных дочерних элементов. Однако никакая комбинация (которую я нашел) не устраняет ошибки фреймворка, с которыми я сталкиваюсь. Я ищу методы полного обновления апплета, даже если они могут вызвать небольшое мерцание, поскольку я буду вызывать этот код только на проблемной платформе.

В моих тестах переход на Swing не помог решить мою проблему.

Кстати, это упрощение моей предыдущей (более сложной) публикации: Java-апплет, проблема с обновлением AWT Mac OS X 10.4

Изменить: исследование потоковой передачи не решило эту проблему. Отмечать лучший ответ как хороший.


person Jason Kealey    schedule 13.10.2008    source источник


Ответы (5)


Это происходит постоянно, если вы не программируете внимательно в AWT / Swing.

Прежде всего, вы должны проделать ВСЮ работу над потоком событий. Это означает, что вы не можете делать ничего из этого в своем основном операторе (или в том, что он вызывает напрямую). Я знаю, что каждое когда-либо изобретенное приложение с графическим пользовательским интерфейсом Java нарушает это правило, но это правило.

По большей части они говорили, что вы можете использовать поток, отличный от awt, до тех пор, пока окно не будет «реализовано» (pack / setVisible), но Sun выяснила, что это не всегда работает.

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

В-третьих, (и это расширение «Первого», если вы получили обратный вызов, который НЕ уже находится в рабочем потоке AWT, обязательно поместите его в поток AWT, прежде чем делать что-либо с графическим интерфейсом.

Как правило, любое событие, генерируемое компонентом AWT, будет в правильном потоке. События, сгенерированные таймерами, потоками, созданными вручную, или одноручным вызовом main () - нет.

person Bill K    schedule 13.10.2008
comment
Я исследую различные потоки, используемые в этом сценарии. Слышали ли вы о каких-либо проблемах с потоками, которые чаще возникают в Mac OS X 10.4? - person Jason Kealey; 14.10.2008
comment
Конечно, могут, поскольку проблемы с потоками будут сильно зависеть от того, как выполняется перерисовка, и от времени в целом. У меня были такие проблемы, когда мне приходилось начинать с чего-то очень простого и добавлять / тестировать постепенно. - person Bill K; 15.10.2008
comment
Следует ли вызывать JDialog.setVisible (true) в потоке событий? Кажется, что он заблокирует поток событий, пока диалог не закроется? - person Roy Tang; 18.11.2009

Как вы упомянули, для решения этой проблемы можно использовать перерисовку. Возможно, вы столкнулись с проблемой с используемой JVM. Я бы порекомендовал использовать разные версии Sun JVM и даже MS VM для IE, чтобы увидеть, связана ли это с проблемой виртуальной машины - это может фактически не иметь отношения к вашему коду.

Я на самом деле не пробовал это раньше, но творческий способ (например, неприятный взлом) может заключаться в том, чтобы выполнить javascript из апплета для вызова метода DOM для имитации изменения размера окна или, возможно, вызова фокуса на теле в попытка вызвать внешнюю перерисовку холста.

person J c    schedule 13.10.2008
comment
- Это проблема Java в Mac OS X 10.4, независимо от версии Java (1.4 или 1.5 или другая). - Я не могу использовать JavaScript, так как работаю внутри Java Web Start. - Как бы вы перекрасили? Только контейнер верхнего уровня или все дочерние элементы при поиске в глубину? - Вы бы сначала обесценили? - person Jason Kealey; 14.10.2008
comment
Обычно я ожидал, что перерисовки контейнера верхнего уровня будет достаточно. Однако похоже, что это может быть проблема времени, связанная с потоком (к сожалению), как было предложено Биллом К. - person J c; 14.10.2008

Не уверен, связано ли это с тем, что вы видели, но если вы столкнетесь с производительностью очереди событий AWT, мир java 2d + 3d (ребята из графического конвейера) укажет на многопоточную стратегию, и тогда вы попадете в проблема утилизации.

Это обсуждение рассматривало проекты, использующие очередь событий AWT для графики, например, при использовании «перерисовки».

В многопоточном подходе возникает проблема завершения работы.

Примечания в java / awt / SequencedEvent для «dispose» указывают на «Проблемы с потоками AWT» и «Autoshutdown».

Я думаю, что эта информация поможет хотя бы сосредоточить внимание на проблеме.

person Community    schedule 06.11.2009

Я смог исправить 99% проблем с перерисовкой моего апплета AWT, переключившись на Swing. Swing кажется более надежным при обновлении.

Раньше у меня было много ручных перерисовок () в моем коде апплета, но с Swing они были удалены, и апплет теперь работает быстрее, особенно в терминальном сервере / LTSP.

Внутри я поместил важные вещи:

public class VeryFastPanel extends JPanel {



    /**
         *
         */
        private static final long serialVersionUID = 1L;

        public void update(Graphics g) {

      paint(g);
    }

}
person Tom    schedule 14.10.2008

Я обнаружил ту же проблему, что и вы. После некоторых тестов я обнаружил, что это может быть связано с адаптерами Aero и Intel Graphics. В моем случае приложение перестало перерисовываться только при использовании в ноутбуках без адаптеров переменного тока, питающихся от батареек. Если вы отключите некоторые функции энергосбережения в конфигурации драйвера Intel (особенно Intel 2D Display Technology в старых версиях драйверов), Java снова перекрасится в обычном режиме.

В моем случае я также нашел способы отключить эту опцию через реестр. Это не задокументировано, но работает.

person Vinicius Canto Xavier    schedule 23.05.2011
comment
Что это за недокументированные способы? - person BryanH; 24.05.2011