Прокси-сервер «растяжение изображения» для медленного компонента Swing?

У меня есть приложение, которое отображает графики с помощью JFreeChart. Как это бывает, эти графики большие, а JFreeChart работает не очень быстро, что приводит к чудовищному времени перерисовки, особенно при изменении размера графика.

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

Функции взаимодействия на диаграмме должны остаться нетронутыми (разумеется, без изменения размера).

Есть ли для этого универсальное решение/оболочка Swing? (нет причин, по которым это должно быть специфичным для JFreeChart).

Ваше здоровье


person Rom1    schedule 08.09.2011    source источник
comment
хм ... не совсем понимаю, как это может сильно помочь: в конце изменения размера пользователю все равно приходится ждать ужасного времени перерисовки. Какую разницу вы ожидаете/испытываете во время изменения размера? Кроме того, пользователи могут быть сбиты с толку, если попытаются изменить размер для лучшего соответствия области просмотра, но он не изменится.   -  person kleopatra    schedule 08.09.2011
comment
Это помогло бы, если бы пользователь мог изменять размер окна одним плавным жестом (без перерывов из-за перерисовки), даже если ему придется подождать в конце (т. Е. Несколько медленных перерисовок свернутся в одну).   -  person Rom1    schedule 08.09.2011
comment
вы имеете в виду, что медленная перерисовка предотвращает изменение размера? Если так, то звучит подозрительно для меня   -  person kleopatra    schedule 08.09.2011
comment
Да, это так; почему это подозрительно для вас? (насколько мне известно, перерисовка происходит в EDT)   -  person Rom1    schedule 08.09.2011
comment
ааа .. ладно, так что это на самом деле блокирует EDT, тем самым предотвращая любое взаимодействие   -  person kleopatra    schedule 08.09.2011
comment
Ага. если у вас есть ссылки на ресурсы о том, что разрешено за пределами EDT (например, рисование за кадром), это было бы действительно здорово   -  person Rom1    schedule 08.09.2011
comment
Не ищите ярлыков! Список потокобезопасных методов Swing становится короче с каждой новой версией; подробнее здесь.   -  person trashgod    schedule 08.09.2011
comment
Можете ли вы предоставить sscce, демонстрирующий проблему? Это большой набор данных или медленный рендерер?   -  person trashgod    schedule 11.09.2011


Ответы (1)


Нет конкретного ответа, просто возможная стратегия

  • при запуске изменения размера нарисуйте график в BufferedImage и покажите и измените размер этого изображения вместо графика
  • при остановке изменения размера удалить изображение и снова показать график

в JDK 7 вы можете использовать JLayer для изображения/манипуляции.

Изменить

В качестве альтернативы (для JLayer) вы можете использовать CardLayout: показывать одну карту с изображением при изменении размера, а другую карту с графиком без изменения размера. SwingX ImagePainter может выполнять масштабирование изображения во время изменения размера.

person kleopatra    schedule 08.09.2011