我使用JUNG来可视化我的图形/网络。 现在我想在图像文件中保存图形(如VisualizationViewer中所示)。我使用VisualizationViewer的paint()/ paintAll()函数(扩展JPanel)。但是使用此功能,只有实际显示在VisualizationViewer中的部分(例如放大后)才会出现在图像中。我想绘制所有顶点和边缘。有没有办法绘制所有元素?
答案 0 :(得分:2)
我找到了使用freeHEP library和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上添加一个按钮。
答案 1 :(得分:1)
我对JUNG一无所知,但它只是扩展了一个JPanel来进行绘画然后你应该能够使用Screen Image类来创建任何组件的图像。