У меня проблемы с отображением JGraphX с автоматическим макетом.
Моя программа (код ниже) создает такой вывод:
Достаточный результат мог бы выглядеть так (я перемещал их вручную):
Мне не нужно придерживаться JGraphX
. Я также тестировал JUNG
и JGraphT
. Но это был мой лучший результат на данный момент. Что мне нужно, так это представление моих данных с направленными краями и некоторыми метками на нем.
Я сделал пример кода, который показывает, как он создается. Он похож на http://forum.jgraph.com/questions/4810/how-to-layout-nodes-automatically-using-fast-organic-layout. Есть комментарий от 2012 года, в котором упоминается та же проблема: «[...] Однако я заметил, что узлы иногда перекрываются, знаете ли вы способ исправить это, я играл со свойствами, и это кажется довольно случайным. Есть ли какие-нибудь советы, как улучшить внешний вид в целом?»
public class Test extends JFrame {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(800, 800);
f.setLocation(300, 200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final mxGraph graph = new mxGraph();
mxGraphComponent graphComponent = new mxGraphComponent(graph);
f.getContentPane().add(graphComponent, BorderLayout.CENTER);
f.setVisible(true);
Object parent = graph.getDefaultParent();
graph.getModel().beginUpdate();
try {
Object start = graph.insertVertex(parent, "start", "start", 100,
100, 80, 30);
for (int i = 0; i < 10; i++) {
Object a = graph.insertVertex(parent, "A" + i, "A" + i, 100,
100, 80, 30);
graph.insertEdge(parent, null, "E" + i, start, a);
Object b = graph.insertVertex(parent, "B" + i, "B" + i, 100,
100, 80, 30);
graph.insertEdge(parent, null, "E" + i, a, b);
start = a;
}
} finally {
graph.getModel().endUpdate();
}
morphGraph(graph, graphComponent);
}
private static void morphGraph(mxGraph graph,
mxGraphComponent graphComponent) {
// define layout
mxIGraphLayout layout = new mxFastOrganicLayout(graph);
// layout using morphing
graph.getModel().beginUpdate();
try {
layout.execute(graph.getDefaultParent());
} finally {
mxMorphing morph = new mxMorphing(graphComponent, 20, 1.5, 20);
morph.addListener(mxEvent.DONE, new mxIEventListener() {
@Override
public void invoke(Object arg0, mxEventObject arg1) {
graph.getModel().endUpdate();
// fitViewport();
}
});
morph.startAnimation();
}
}
}
График сгенерирован из примера: