mxHierarchicalLayout not working as expected

2019-05-13 15:55发布

问题:

I'm using JGraphx to draw a graph inside a Swing Panel and all works fine. I try to insert two cells inside a target cell and is working, but layout is changing and all cells are not horizontal.

So my example is: 1) build a graph with some cells:

2) press top botton and add two cells inside Hello:

As you can see, problem is layout is not horizontal anymore, even if I call again mxHierarchicalLayout.

Thanks for answers!

    package com.mxgraph.examples.swing;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;

import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
import com.mxgraph.model.mxCell;
import com.mxgraph.model.mxGraphModel;
import com.mxgraph.model.mxICell;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;

public class HelloWorld extends JFrame {

    private mxGraphComponent graphComponent;

    private int idgenerator = 0;

    public HelloWorld() {
    super("Hello, World!");
    mxGraph graph = new mxGraph();
    Object parent = graph.getDefaultParent();

    graph.getModel().beginUpdate();
    try {
        Object v1 = graph.insertVertex(parent,
            String.valueOf(++idgenerator), "Hello", 20, 20, 80, 30);
        Object v2 = graph.insertVertex(parent,
            String.valueOf(++idgenerator), "World!", 240, 150, 80, 30);
        graph.insertEdge(parent, String.valueOf(++idgenerator), "Edge", v1,
            v2);
        Object v3 = graph.insertVertex(parent,
            String.valueOf(++idgenerator), "Brando!", 240, 150, 80, 30);
        graph.insertEdge(parent, String.valueOf(++idgenerator), "Edge", v2,
            v3);
        Object v4 = graph.insertVertex(parent,
            String.valueOf(++idgenerator), "Jotaro!", 240, 150, 80, 30);
        graph.insertEdge(parent, String.valueOf(++idgenerator), "Edge", v3,
            v4);

    } finally {
        graph.getModel().endUpdate();
    }

    graphComponent = new mxGraphComponent(graph);
    getContentPane().add(graphComponent, BorderLayout.CENTER);

    graphComponent.getGraphControl().addMouseListener(new MouseAdapter() {

        @Override
        public void mouseReleased(MouseEvent e) {
        Object cell = graphComponent.getCellAt(e.getX(), e.getY());

        if (cell != null) {
            System.out.println("cell=" + graph.getLabel(cell));
            JOptionPane.showMessageDialog(graphComponent, "cell="
                + graph.getLabel(cell));
        }
        }
    });

    layoutGraph(graph);

    JButton change = new JButton("change");
    change.setPreferredSize(new Dimension(100, 50));
    change.setAction(new AbstractAction() {

        private static final long serialVersionUID = -1085992528036117542L;

        @Override
        public void actionPerformed(ActionEvent e) {
        mxGraph graph = graphComponent.getGraph();
        mxGraphModel model = (mxGraphModel) graph.getModel();
        mxCell before = (mxCell) model.getCells().get("2");
        graph = insertIn(graph, before);

        layoutGraph(graph);
        }

        public mxGraph insertIn(mxGraph graph, mxCell target) {
        Object parent = graph.getDefaultParent();

        graph.getModel().beginUpdate();
        try {
            mxGraphModel model = (mxGraphModel) graph.getModel();
            mxCell ed = (mxCell) target.getEdgeAt(0);

            mxICell t = ed.getTarget();

            model.remove(ed);

            Object v1 = graph.insertVertex(parent,
                String.valueOf(++idgenerator), "HERE!", 20, 20, 80,
                30);

            Object v2 = graph.insertVertex(parent,
                String.valueOf(++idgenerator), "HERE2", 20, 20, 80,
                30);

            target.insert((mxICell) v1);
            target.insert((mxICell) v2);
            target.setCollapsed(false);

            graph.insertEdge(parent, String.valueOf(++idgenerator), "",
                v1, v2);

            graph.insertEdge(parent, String.valueOf(++idgenerator), "",
                v2, t);

        } finally {
            graph.getModel().endUpdate();
        }
        return graph;
        }
    });

    getContentPane().add(change, BorderLayout.PAGE_START);

    }

    public void layoutGraph(mxGraph graph) {
    mxHierarchicalLayout layout = new mxHierarchicalLayout(graph);
    layout.setOrientation(SwingConstants.WEST);
    layout.execute(graph.getDefaultParent());
    }

    public static void main(String[] args) {
    HelloWorld frame = new HelloWorld();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800, 400);
    frame.setVisible(true);
    }

}