2015-01-31 5 views
2

Можно активировать процесс компоновки в GraphStream с Viewer#enableAutoLayout(). К сожалению, этот процесс будет влиять на каждое взаимодействие с пользователем, как перетаскивание узла.Как разместить узлы в GraphStream?

Is можно сделать автоматическую компоновку один раз, а затем остановить?

Я попытался включить автоспуск на секунду и подождать, но это не сработало.

package tests.graphstream; 

import java.awt.BorderLayout; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

import org.graphstream.graph.Graph; 
import org.graphstream.graph.implementations.SingleGraph; 
import org.graphstream.ui.swingViewer.View; 
import org.graphstream.ui.swingViewer.Viewer; 

public class Tutorial1_01 { 

    private static Graph graph = new SingleGraph("Tutorial 1"); 

    public static class MyFrame extends JFrame { 

     private static final long serialVersionUID = 8394236698316485656L; 

     //private Graph graph = new MultiGraph("embedded"); 
     private Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD); 
     //private Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_SWING_THREAD); 
     private View view = viewer.addDefaultView(false); 
     private View defaultView = viewer.getDefaultView(); 

     public MyFrame() { 

      setLayout(new BorderLayout()); 

      //add(new JScrollPane(defaultView), BorderLayout.CENTER); 

      add(defaultView, BorderLayout.CENTER); 

      setDefaultCloseOperation(EXIT_ON_CLOSE); 

     } 

    } 

    public static void main(String args[]) { 

     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 


       MyFrame frame = new MyFrame(); 


       frame.setSize(320, 240); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

       graph.addNode("A"); 
       graph.addNode("B"); 
       graph.addNode("C"); 
       graph.addEdge("AB", "A", "B"); 
       graph.addEdge("BC", "B", "C"); 
       graph.addEdge("CA", "C", "A"); 

       graph.addAttribute("ui.quality"); 
       graph.addAttribute("ui.antialias"); 


       frame.viewer.enableAutoLayout(); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
       } 
       frame.viewer.disableAutoLayout(); 

       //frame.view.getCamera().resetView(); 
      } 
     }); 





    } 
} 

ответ

1

Один (но, конечно, не самое лучшее) решение для вычисления макета внутри вашего метода run.

Сначала создайте экземпляр класса макета и подключите его к графику до, изменяя график.

Затем вычислите макет до некоторого состояния остановки. Исправленное количество итераций является безопасным выбором с точки зрения вычислений, но может не дать вам хороших результатов. Вместо этого вы можете выполнять итерацию до тех пор, пока макет не стабилизируется сам по себе (что может не произойти в зависимости от вашего графика ...)

public void run() { 
    MyFrame frame = new MyFrame(); 

    frame.setSize(320, 240); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 

    // a layout algorithm instance plugged to the graph 
    Layout layout = new SpringBox(false); 
    graph.addSink(layout); 
    layout.addAttributeSink(graph); 

    graph.addNode("A"); 
    graph.addNode("B"); 
    graph.addNode("C"); 
    graph.addEdge("AB", "A", "B"); 
    graph.addEdge("BC", "B", "C"); 
    graph.addEdge("CA", "C", "A"); 

    graph.addAttribute("ui.quality"); 
    graph.addAttribute("ui.antialias"); 

    // iterate the compute() method a number of times 
    while(layout.getStabilization() < 0.9){ 
     layout.compute(); 
    } 
} 
Смежные вопросы