現在、JGraph 5アプリケーションをJGraphXに移行しようとしています。複雑なレイアウトのネストされたJComponent
として実装された頂点レンダラーを持っています。JComponentとしてレンダリングされた頂点
mxStylesheet
を使用すると、これまでに頂点レンダリングをカスタマイズすることができました。 JGraphXにレンダラーの概念はありますか?レンダラーをJComponents
として実装することは可能ですか?
現在、JGraph 5アプリケーションをJGraphXに移行しようとしています。複雑なレイアウトのネストされたJComponent
として実装された頂点レンダラーを持っています。JComponentとしてレンダリングされた頂点
mxStylesheet
を使用すると、これまでに頂点レンダリングをカスタマイズすることができました。 JGraphXにレンダラーの概念はありますか?レンダラーをJComponents
として実装することは可能ですか?
この回答がJGraphXのCustomCanvas.javaサンプルで見つかりました。
このサンプルは、非複合コンポーネント(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;
}
}