JUNG: сохранение графика в файл изображения - PullRequest
2 голосов
/ 19 января 2012

Я использую JUNG для визуализации своего графика / сети. Теперь я хочу сохранить график (как видно из VisualizationViewer) в файле изображения. Я использую функцию paint () / paintAll () VisualizationViewer (который расширяет JPanel). Но с этой функцией в изображении присутствует только та часть, которая фактически отображается в VisualizationViewer (например, после увеличения). Я хочу нарисовать все вершины и края. Есть ли способ нарисовать все элементы?

Ответы [ 2 ]

2 голосов
/ 18 декабря 2018

Я нашел решение, используя библиотеку freeHEP и JUNG's VisualizationImageServer:

private void doSaveAs() throws IOException {
    // instantiate and configure image-able visualization viewer
    VisualizationImageServer<Vertex, Edge> vis =
            new VisualizationImageServer<Vertex, Edge>(this.visViewer.getGraphLayout(),
                                                       this.visViewer.getGraphLayout().getSize());

    setUpAppearance(vis);

    ExportDialog export = new ExportDialog();
    export.showExportDialog(vis, "Export view as ...", vis, "export");
}

При вызове откроется диалоговое окно экспорта для пользователя, в котором можно выбрать каталог и тип файла.

В этом фрагменте ExportDialog имеет значение org.freehep.graphicsbase.util.export.ExportDialog, которое вам нужно как-то найти в пути сборки, в моем случае используя maven, добавив freehep-graphicsio в мой файл pom.

Поле this.visViewer содержит ваш обычный экземпляр VisualizationViewer, который вы также использовали бы для отображения графика.

Метод setUpAppearance(vis); выполняет ту же настройку, что и я для экземпляра VisualizationViewer, для целей отображения. Вот пример, детали, вероятно, будут отличаться для вас:

private void setUpAppearance(BasicVisualizationServer<Vertex, Edge> vis) {
    vis.setBackground(BGCOLOR);
    vis.setPreferredSize(new Dimension(1500, 600)); // Sets the viewing area

    // modify vertices
    vis.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
    vis.getRenderContext().setVertexFontTransformer(Transformers.vertexFontTransformer);
    vis.getRenderContext().setVertexShapeTransformer(Transformers.vertexShapeTransformer);
    vis.getRenderContext().setVertexFillPaintTransformer(Transformers.vertexFillPaintTransformer);
    vis.getRenderContext().setVertexDrawPaintTransformer(Transformers.vertexDrawPaintTransformer);
    vis.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);

    // modify edges
    vis.getRenderContext().setEdgeShapeTransformer(Transformers.edgeShapeTransformer);
    vis.getRenderContext().setEdgeDrawPaintTransformer(Transformers.edgeDrawPaintTransformer);
    vis.getRenderContext().setArrowDrawPaintTransformer(Transformers.edgeDrawPaintTransformer);
    vis.getRenderContext().setArrowFillPaintTransformer(Transformers.edgeDrawPaintTransformer);
    vis.getRenderContext().setEdgeArrowPredicate(Transformers.edgeArrowPredicate);
    vis.getRenderContext().setEdgeStrokeTransformer(Transformers.edgeStrokeHighlightingTransformer);
}

В качестве последнего шага вам нужно выяснить, когда следует вызвать doSaveAs. Например, вы можете добавить кнопку в пользовательском интерфейсе для этого.

1 голос
/ 19 января 2012

Я ничего не знаю о JUNG, но он просто расширяет JPanel для рисования, тогда вы сможете использовать класс Screen Image для создания изображения любого компонента.

...