Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

import javax.swing.*;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top