Форматирование графика JGraph с использованием com.jgraph.layout — обновление отображения

Я пишу свою самую первую программу на Java, которая на самом деле делает пользовательский интерфейс, поэтому, пожалуйста, потерпите меня, если ответ на этот вопрос очевиден.

Я использую JGraph 5 (5.14) для визуализации графика, созданного JGrapht (0.8.3).

Я могу создать график с JGrapht просто отлично, и я полагаю, что он будет преобразован в JGraph OK с помощью org.jgrapht.ext.JGraphModelAdapter. Проблема в том, что когда результат отображается в окне (я использую панель в JApplet), все вершины отображаются поверх других.

У кого-то еще была эта проблема (JGraph Layout Does Not Work), и я попробовал представленное решение есть, но тогда отображаются только два узла. По сути, я просто хочу, чтобы график отображался каким-то образом, где узлы отделены друг от друга.

Некоторый код стоит тысячи слов, поэтому вот то, что у меня сейчас есть, которое отображает только два узла (на графике их 219):

class ourGraphVisualizer extends JApplet
{

private static final Color DEFAULT_BG_COLOR = Color.decode("#FAFBFF");
private static final Dimension DEFAULT_SIZE = new Dimension(1280, 1024);

// this init overrides the JApplet.init().  Our class here extends JApplet so we can do the visualization
public void init(ListenableDirectedWeightedGraph<String, DefaultWeightedEdge> theGraph)
{
    JGraphModelAdapter<String, DefaultWeightedEdge> jgAdapter;

    JPanel panel = new JPanel();
    panel.setPreferredSize(DEFAULT_SIZE);

    JScrollPane scrollpane = new JScrollPane(panel);
    scrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    this.getContentPane().add(scrollpane, BorderLayout.CENTER);

    JFrame frame = new JFrame();

    frame.add(this);
    frame.setTitle("Call Graph, " + theGraph.vertexSet().size() + "nodes");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setPreferredSize(DEFAULT_SIZE);

    jgAdapter = new JGraphModelAdapter<String, DefaultWeightedEdge>(theGraph);

    JGraph jgraph = new JGraph(jgAdapter);

    panel.add(jgraph);
    resize(DEFAULT_SIZE);

    // Let's see if we can lay it out
    JGraphFacade jgf = new JGraphFacade(jgraph);
    JGraphFastOrganicLayout layoutifier = new JGraphFastOrganicLayout();
    layoutifier.run(jgf);
    System.out.println("Layout complete");

    final Map nestedMap = jgf.createNestedMap(true, true);
    jgraph.getGraphLayoutCache().edit(nestedMap);

    jgraph.getGraphLayoutCache().update();
    jgraph.refresh();

    frame.setVisible(true);
    panel.setVisible(true);
    scrollpane.setVisible(true);
}

Будем очень признательны за любые конструктивные предложения/помощь/вдохновение!

Спасибо...

-Эрик


person Eric    schedule 20.06.2012    source источник
comment
Привет, пользователь 1055696... Нет, у меня это никогда не работало, поэтому я поставил на лодке. используя JGraphT, я экспортировал график в GraphML, а затем использовал Perfuse, чтобы прочитать GraphML и визуализировать его. Это было немного сложно, но это сработало!   -  person Eric    schedule 19.12.2012


Ответы (2)


Если вы хотите избежать перекрытия вашей вершины, просто попробуйте другой макет графика, который я дал здесь для иерархического макета, и вызовите метод запуска этого

final  JGraphHierarchicalLayout hir = new JGraphHierarchicalLayout();
final JGraphFacade graphFacade = new JGraphFacade(jgraph);      
hir.run(graphFacade);
        final Map nestedMap = graphFacade.createNestedMap(true, true);
        jgraph.getGraphLayoutCache().edit(nestedMap);
person Yogesh Gadakh    schedule 13.03.2013

Гораздо лучше создать две панели JPanel и добавить свои графики по отдельности в панели JPanel и панели JPanel в JFrame с помощью соответствующего менеджера компоновки.

person vedant    schedule 21.06.2012
comment
Спасибо, verdant, но не могли бы вы немного конкретизировать детали? В частности, у меня есть только один график... нужны ли мне две панели JPanel? Кроме того, как мне... добавить графики в JPanel с помощью соответствующего менеджера компоновки? Как менеджер компоновки взаимодействует с JPanel? Еще раз спасибо за ваш ответ. - person Eric; 21.06.2012
comment
Кажется, что «макет», на который ссылается OP, - это не «менеджер макетов», как часто обсуждается, а концепция, специфичная для объектов на графике. - person Andrew Thompson; 21.06.2012
comment
Верно, Андрей! Строка: JGraphFastOrganicLayout layoutifier = new JGraphFastOrganicLayout(); относится к классу com.jgraph.layout.graph - person Eric; 21.06.2012
comment
1 из конструкторов JPanel принимает аргумент LayoutManager (docs. oracle.com/javase/6/docs/api/javax/swing/JPanel.html) или вы можете использовать метод setLayout(LayoutManager mgr). - person vedant; 22.06.2012
comment
Если у вас есть только 1 график, используйте только 1 JPanel. то ваша ошибка заключается в преобразовании вашего графика - person vedant; 22.06.2012