2016-04-15 9 views
1

現在、JGraph 5アプリケーションをJGraphXに移行しようとしています。複雑なレイアウトのネストされたJComponentとして実装された頂点レンダラーを持っています。JComponentとしてレンダリングされた頂点

mxStylesheetを使用すると、これまでに頂点レンダリングをカスタマイズすることができました。 JGraphXにレンダラーの概念はありますか?レンダラーをJComponentsとして実装することは可能ですか?

答えて

2

この回答がJGraphXのCustomCanvas.javaサンプルで見つかりました。

このサンプルは、非複合コンポーネント(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; 
    } 
} 
関連する問題