У нас есть 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, который, если я не ошибаюсь, должен запускаться в нужном потоке. Проблема наиболее остра при прокрутке, даже если не запущены лишние потоки (как во время загрузки).