Рендеринг на поверхность SWING (например, JPanel) с использованием Cairo - PullRequest
1 голос
/ 07 ноября 2011

В настоящее время я работаю над проектом, в котором мне нужно нанести прогнозируемый след спутника на проецируемую меркатором карту мира с возможным масштабированием / кадрированием / и т. Д.сделано на карту.

Я думал, что Каир будет хорошей библиотекой для этой цели.Для этого есть Java-привязки.Тем не менее, я просто не могу найти способ заставить его рендерить на графический интерфейс SWING (например, на поверхность JPanel).Я думал о рендеринге в байтовый буфер и построении его попиксельно с использованием Java2D, но я не могу найти какой-либо вызов API, чтобы сделать Cairo рендерингом в буфер (что странно, так как это одна из самых фундаментальных функций, которые я использую)я ожидал, что меня поддержит такая библиотека).

Как я могу этого добиться?Я знаю, что есть Java2D, но он довольно простой.Я действительно ценю более мощную, широко распространенную, хорошо протестированную, высококачественную, бесплатную (LGPL) графическую библиотеку для этой цели.Каир был бы идеальным выбором, если бы я мог как-то заставить его работать с SWING.

Большое спасибо за ваши предложения.

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

Одним из основных принципов в Каире является то, что любой неабстрактный контекст изображения связан с одним из поддерживаемых серверных компонентов.Я никогда не пробовал привязки Java, но, скорее всего, они представляют собой тонкий слой, не предоставляющий новый тип поверхности - вам следует использовать тип «Поверхность изображения».

В документации C для библиотеки,есть вызов cairo_image_surface_get_data () (здесь: http://cairographics.org/manual/cairo-Image-Surfaces.html), который дает один доступ к буферу.Возможно, привязки не предоставили эту информацию Java из-за низкого уровня доступа к памяти, необходимого для фактического использования ее содержимого.Если это так, то я предлагаю вам следующий способ:

(1) Отобразите ваши результаты на Cairo Image Surface, (2) Напишите временный файл с содержимым поверхности, (3) Прочитайте иотобразить временный файл с помощью Java 2D API.

1 голос
/ 13 января 2014

Вот пример .Я нашел эти примеры на http://java -gnome.sourceforge.net Он создает окно gtk, а на самом деле - виджет gtk DrawingArea, событие onDraw () использует cairo.Я скомпилировал и запустил его на Linux, он работает хорошо.

однако java-gnome, похоже, имеет только бинарный файл linux.Может быть, кто-то может сделать бинарный файл для Windows, но нужно немного поработать.

Это окно GTK, поэтому не имеет ничего общего с Swing.Возможно, вам не нужен свинг, если gtk (java-gnome) может соответствовать вашим потребностям.

Если вам нужно использовать свинг, вы можете использовать cairo для рендеринга изображения в памяти, а затем показать его JComponent с помощью чего-токак переопределение метода paintComponent ().Я не знаю производительность.

...