2016-04-15 4 views
1

В настоящее время я пытаюсь перенести приложение JGraph 5 в JGraphX. У меня есть вершинные рендереры, реализованные как вложенные JComponent со сложной компоновкой.Vertex renderered as JComponent

Использование mxStylesheet является единственным, что я нашел до сих пор, чтобы настроить визуализацию веры. Есть ли какая-либо концепция рендеринга в JGraphX? Можно ли реализовать средства визуализации как JComponents?

ответ

2

Я нашел ответ в примере CustomCanvas.java JGraphX.

Этот образец отлично работает для некомпозитных компонентов (JLabel ...), но не работает для составных компонентов. Метод paintComponent() вызывается для родителя, но не для детей. Похоже, что это связано с тем, что CellRendererPane не является родителем в этом образце. Добавление к 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; 
    } 
}