我目前正在尝试将JGraph 5应用程序迁移到JGraphX。我将顶点渲染器实现为具有复杂布局的嵌套JComponent
。
使用mxStylesheet
是迄今为止我发现的唯一定制椎骨渲染的方法。 JGraphX中是否有渲染器概念?是否可以将渲染器实现为JComponents
?
答案 0 :(得分:2)
我在CustomCanvas.java JGraphX样本中找到了答案。
此示例适用于非复合组件(JLabel ...),但复合组件失败。为父级调用paintComponent()方法,但不为子级调用。这似乎与此示例中CellRendererPane
没有父亲这一事实有关。向graphComponent添加CellRendererPane
解决了问题(对我而言,画布是自然父级,但它似乎不是一个容器)。
所以,我原来的问题的答案是:不,JGraphX不提供对渲染器的支持,但似乎你可以通过继承mxGraph
,mxGraphComponent
和你自己来添加这样的支持。 mxInteractiveCanvas
。
最后,可以轻松扩展此示例以实现"渲染器"模式以更常见的方式。我没有介绍一个渲染器工厂来保持片段短,但这可能是有道理的。
public class SwingCanvas<USER_OBJECT> extends mxInteractiveCanvas {
private final CellRendererPane rendererPane = new CellRendererPane();
protected mxGraphComponent graphComponent;
public SwingCanvas(SwingMxGraphComponent<USER_OBJECT> graphComponent) {
this.graphComponent = graphComponent;
graphComponent.add(rendererPane);
}
public void drawVertex(mxCellState state, String label) {
SwingMxGraph<USER_OBJECT> graph = graphComponent.getGraph();
VertexRenderer<USER_OBJECT> vertexRenderer = graph.getVertexRenderer();
USER_OBJECT userValue = (USER_OBJECT)((mxCell)state.getCell()).getValue();
JComponent rendererComponent = vertexRenderer.getRendererComponent(graphComponent.getGraph(), userValue);
rendererPane.paintComponent(g, rendererComponent, graphComponent,
(int) state.getX() + translate.x,
(int) state.getY() + translate.y,
(int) state.getWidth(), (int) state.getHeight(), true);
}
}
public interface VertexRenderer<USER_OBJECT> {
/* Provide graph instance just in case...*/
JComponent getRendererComponent(mxGraph graph, USER_OBJECT userObject);
}
public class SwingMxGraph<USER_OBJECT> extends mxGraph {
private VertexRenderer<USER_OBJECT> vertexRenderer;
/* Add the same method override as in sample
...
... */
public VertexRenderer<USER_OBJECT> getVertextRenderer() {
return vertexRenderer;
}
}