2016-04-15 22 views
1

我目前正在尝试将JGraph 5应用程序迁移到JGraphX。我将顶点渲染器实现为具有复杂布局的嵌套JComponentVertex renderered as JComponent

使用mxStylesheet是我发现迄今为止唯一定制vertext渲染。 JGraphX中有渲染器的概念吗?是否有可能将渲染器实现为JComponents

回答

2

我在CustomCanvas.java JGraphX示例中找到了答案。

此示例适用于非复合组件(JLabel ...),但复合组件失败。 paintComponent()方法是为父级调用的,但不是为子级调用的。这似乎与CellRendererPane这个样本中没有父项的事实有关。添加到graphComponent的CellRendererPane解决了这个问题(对我来说,画布是自然的父类,但它似乎不是一个容器)。

,则回答我原来的问题是:没有,JGraphX不适合渲染器提供支持,但似乎你可以通过继承两个mxGraphmxGraphComponentmxInteractiveCanvas自己添加这种支持。

最后,这个示例可以很容易地扩展,以更常用的方式实现“渲染器”模式。我没有引入渲染器工厂来缩短代码片段,但这可能是有道理的。

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; 
    } 
}