首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >顶点呈现为JComponent

顶点呈现为JComponent
EN

Stack Overflow用户
提问于 2016-04-15 09:55:27
回答 1查看 165关注 0票数 1

我目前正在尝试将JGraph 5应用程序迁移到JGraphX。我的顶点呈现器被实现为具有复杂布局的嵌套JComponent

使用mxStylesheet是到目前为止我发现的唯一自定义vertext呈现的方法。在JGraphX中有渲染器的概念吗?是否可以将呈现器实现为JComponents

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-18 07:31:15

我在CustomCanvas.java JGraphX示例中找到了答案。

此示例适用于非复合组件(JLabel.)但是复合组件失败了。paintComponent()方法是为父类调用的,而不是为子级调用的。这似乎与以下事实有关:在本示例中,CellRendererPane没有作为父级。将CellRendererPane添加到graphComponent解决了这个问题(对我来说,画布是天然的父级,但它似乎不是一个容器)。

因此,我最初问题的答案是:不,JGraphX不提供对呈现器的支持,但是您似乎可以通过子类mxGraphmxGraphComponentmxInteractiveCanvas来添加这样的支持。

最后,这个示例可以很容易地扩展到以更常见的方式实现“呈现器”模式。我没有引入渲染工厂来保持代码片段的简短,但这可能是有意义的。

代码语言:javascript
复制
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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36643943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档