2

我使用 JUNG 来可视化我的图形/网络。现在我想将图形(如 VisualizationViewer 中所示)保存在图像文件中。我使用 VisualizationViewer(扩展 JPanel)的 paint() / paintAll() 函数。但是使用此功能,只有在 VisualizationViewer 中实际显示的部分(例如放大后)在图像中。我想绘制所有顶点和边。有没有办法绘制所有元素?

4

2 回答 2

2

我找到了使用freeHEP 库和 JUNG 的解决方案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,您必须以某种方式到达您的构建路径,在我的情况下,通过添加freehep-graphicsio到我的 pom 文件中使用 maven。

该字段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应该调用。例如,您可以为此在 UI 上添加一个 Button。

于 2018-12-18T14:20:06.343 回答
1

我对 JUNG 一无所知,但它只是扩展了一个 JPanel 来进行绘画,然后您应该能够使用Screen Image类来创建任何组件的图像。

于 2012-01-19T16:01:19.060 回答