我目前正在嘗試將JGraph 5應用程序遷移到JGraphX。我將頂點渲染器實現爲具有複雜佈局的嵌套JComponent
。Vertex renderered as JComponent
使用mxStylesheet
是我發現迄今爲止唯一定製vertext渲染。 JGraphX中有渲染器的概念嗎?是否有可能將渲染器實現爲JComponents
?
我目前正在嘗試將JGraph 5應用程序遷移到JGraphX。我將頂點渲染器實現爲具有複雜佈局的嵌套JComponent
。Vertex renderered as JComponent
使用mxStylesheet
是我發現迄今爲止唯一定製vertext渲染。 JGraphX中有渲染器的概念嗎?是否有可能將渲染器實現爲JComponents
?
我在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;
}
}