Java-апплет, обновление AWT, проблема в Mac OS X 10.4 - PullRequest
0 голосов
/ 08 октября 2008

У нас есть Java-апплет, созданный с использованием AWT. Этот апплет позволяет выбирать изображения с жесткого диска и загружать их на сервер. Апплет содержит прокручиваемый список изображений, который отлично работает в Windows, Linux и Mac OS X 10.5. Мы запускаем этот апплет через Java Web Start или на веб-странице.

Наш апплет не работает должным образом в Mac OS X 10.4, независимо от версии Java (1.4 или 1.5). Вы можете найти скриншот некорректного поведения при прокрутке здесь:

http://www.lavablast.com/tmp/ui_error.png

Проще говоря, иногда при прокрутке изображения перекрывают верхний или нижний колонтитулы приложения. Такое поведение не происходит на других платформах. В Mac OS X 10.4 при прокрутке изображения отображаются в неверном месте, что было бы неплохо, если бы обновлялся экран после рисования изображения в этом месте. Однако не похоже, что приложение знает, что оно нарисовало его неправильно, и поэтому не обновляется.

Если окно свернуто, изменено в размере или даже перемещено, приложение обновляется, и неправильно расположенные элементы исчезают, и приложение возобновляет работу в обычном режиме. Я потратил довольно много времени, пытаясь принудительно обновить фоновое изображение. (перерисовать изображение напрямую, перерисовать все дочерние элементы нескольких панелей и т. д.) Таким образом, я ищу любые советы, которые помогли бы мне решить эту проблему в Mac OS X 10.4 или, в худшем случае, просто смоделировать полный апплет обновить.

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

Чтобы воспроизвести проблему, откройте следующее приложение Java Web Start: http://www.lavablast.com/tmp/opal-webstart.php.jnlp

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

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

Edit2: основной поток создает панели и запускает X-потоки. Используя шаблон наблюдателя / уведомителя, потоки завершают работу и уведомляют главный элемент управления, который добавляет панель на страницу. Это делается через EventQueue.invokeLater, который, если я не ошибаюсь, должен запускаться в нужном потоке. Проблема наиболее остра при прокрутке, даже если не запущены лишние потоки (как во время загрузки).

Ответы [ 2 ]

1 голос
/ 14 октября 2008

Это похоже на смешивание легких (обычно Swing) и тяжелых (AWT) компонентов вместе. Переходя на Swing, вам необходимо заменить каждый последний эквивалент AWing компонентом AWT (подсказка: избегайте импорта java.awt. *).

Многопоточность часто является потенциальной проблемой для нечетных ошибок. Компоненты качания всегда должны использоваться на EDT (используйте java.awt.EventQueue.invokeLater). AWT является поточно-ориентированным в теории, но не на практике, а также ограничивает использование EDT.

1 голос
/ 09 октября 2008

Поскольку вам уже требуется Java 1.4, вам следует рассмотреть некоторые небольшие изменения, чтобы вместо этого использовать SWING GUI, это решило наши проблемы обновления апплета с помощью AWT. (Mac, Linux и т. Д.)

Если у вас есть, например, Панель, вам нужно заменить ее на JPanel и т. Д.

Вам нужно это:

import javax.swing.*;
...