顶点渲染为JComponent
我目前正在尝试将JGraph 5应用程序迁移到JGraph X。我将顶点渲染器实现为具有复杂布局的嵌套顶点渲染为JComponent,jcomponent,jgraphx,Jcomponent,Jgraphx,我目前正在尝试将JGraph 5应用程序迁移到JGraph X。我将顶点渲染器实现为具有复杂布局的嵌套JComponent 使用mxStylesheet是迄今为止我发现的唯一一种自定义vertext渲染的方法。JGraphX中是否有渲染器概念?是否可以将渲染器实现为JComponents?我在JGraphX示例中找到了答案 此示例适用于非复合组件(JLabel…),但不适用于复合组件。paintComponent()方法是为父对象而不是子对象调用的。这似乎与以下事实有关:CellRenderPa
JComponent
使用mxStylesheet
是迄今为止我发现的唯一一种自定义vertext渲染的方法。JGraphX中是否有渲染器概念?是否可以将渲染器实现为JComponents
?我在JGraphX示例中找到了答案
此示例适用于非复合组件(JLabel…),但不适用于复合组件。paintComponent()方法是为父对象而不是子对象调用的。这似乎与以下事实有关:CellRenderPane
在此示例中没有父级。将CellRenderPane
添加到graphComponent解决了这个问题(对我来说,画布是天然的父对象,但它似乎不是一个容器)
因此,我的原始问题的答案是:不,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;
}
}
公共类SwingCanvas扩展了mxInteractiveCanvas{
私有最终CellRenderPane RenderPane=新CellRenderPane();
受保护的mxGraphComponent graphComponent;
公共SwingCanvas(SwingMxGraphComponent graphComponent){
this.graphComponent=graphComponent;
graphComponent.add(渲染器窗格);
}
公共void drawVertex(mxCellState状态,字符串标签){
SwingMxGraph-graph=graphComponent.getGraph();
VertexRenderer VertexRenderer=graph.getVertexRenderer();
USER_OBJECT userValue=(USER_OBJECT)((mxCell)state.getCell()).getValue();
JComponent RenderComponent=vertexRenderer.GetRenderComponent(graphComponent.getGraph(),userValue);
RenderPane.paintComponent(g、RenderComponent、graphComponent、,
(int)state.getX()+translate.x,
(int)state.getY()+translate.y,
(int)state.getWidth(),(int)state.getHeight(),true);
}
}
公共接口顶点渲染器{
/*提供图形实例以防*/
JComponent GetRenderComponent(mxGraph图形,用户对象userObject);
}
公共类SwingMxGraph扩展了mxGraph{
私有顶点渲染器顶点渲染器;
/*添加与示例中相同的方法替代
...
... */
公共顶点渲染器GetVertexRenderer(){
返回顶点渲染器;
}
}