顶点渲染为JComponent

顶点渲染为JComponent,jcomponent,jgraphx,Jcomponent,Jgraphx,我目前正在尝试将JGraph 5应用程序迁移到JGraph X。我将顶点渲染器实现为具有复杂布局的嵌套JComponent 使用mxStylesheet是迄今为止我发现的唯一一种自定义vertext渲染的方法。JGraphX中是否有渲染器概念?是否可以将渲染器实现为JComponents?我在JGraphX示例中找到了答案 此示例适用于非复合组件(JLabel…),但不适用于复合组件。paintComponent()方法是为父对象而不是子对象调用的。这似乎与以下事实有关:CellRenderPa

我目前正在尝试将JGraph 5应用程序迁移到JGraph X。我将顶点渲染器实现为具有复杂布局的嵌套
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(){
返回顶点渲染器;
}
}