Java-апплет, обновление AWT, проблема в Mac OS X 10.4
У нас есть 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 ответа
Это выглядит как смешивание легких (обычно Swing) и тяжелых (AWT) компонентов. Переходя на Swing, вам необходимо заменить каждый последний эквивалент AWing компонентом Swing (подсказка: избегайте импорта java.awt.*).
Потоки часто являются потенциальной проблемой для нечетных ошибок. Компоненты Swing всегда должны использоваться на EDT (используйте java.awt.EventQueue.invokeLater
). AWT является поточно-ориентированным в теории, но не на практике - также ограничивает использование EDT.
Поскольку вам уже требуется Java 1.4, вы должны рассмотреть некоторые небольшие изменения, чтобы использовать вместо этого SWING GUI, это решило наши проблемы обновления апплета с AWT. (Mac, Linux и т. Д.)
Если у вас есть, например, Panel, вам нужно заменить ее на JPanel и т. Д.
Ты нуждаешься в этом:
import javax.swing.*;