2016-12-16 11 views
1

У меня есть довольно большое дерево ZEST, отображающее Hashtree (Merkletree). Из-за его размера и ограниченного свободного пространства она становится настолько сжаты, вы не можете прочитать больше:Как прокрутить ZEST-график в его содержащей оболочке

my ZEST Graph

Поэтому я хочу, чтобы иметь возможность захватить больше места, чем фактическая оболочка имеет, и реализовать скроллинг/перетаскивание, чтобы перемещаться с помощью мыши.

Однако я не могу найти подэлемент, в котором я могу его содержать, который не заполняется в пространстве, которое у меня есть.

Я уже пробовал SashForm (org.eclipse.swt.custom.SashForm), но он не мог стать больше, чем окно.

Есть ли возможность реализовать мой план или он вообще не поддерживается в SWT?

+0

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

ответ

0

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

Если нет встроенной поддержки, вы можете использовать SWT ScrolledComposite. Смотрите здесь для получения дополнительной информации:

+0

Спасибо за азерсера, мне действительно удалось заставить его работать с композитом Composite и SashForm и выведет код, когда он будет готов. – tassadarius

0

Задавая стиль Graph к SWT.V_SCROLL | SWT.H_SCROLL вы может сделать график прокручиваемым:

Graph graph = new Graph(shell, SWT.H_SCROLL | SWT.V_SCROLL); 
+0

Это не работает. Да, граф становится прокручиваемым, но он получает пространство, выделенное из GridLayout, которое не распространяется. Таким образом, график просто остается в своих границах и прокручивается, но не активно получает больше места – tassadarius

0

По прошествии некоторого времени я работал нормально. Я использую простой PaintListener с помощью метода setSize. Для Масштабирования я использую класс org.eclipse.gef.editparts.ZoomManager. Я нашел одно большое disatvantage, этот класс требует большой производительности.

Надеюсь, что код дает понять, почему и как.

public class ZoomableZestGraph extends Composite { 

private GraphViewer graphViewer; 
private Graph graph; 

public ZoomableZestGraph(Composite parent, int style) { 
    super(parent, style); 
    this.setLayout(new GridLayout(1, true));  
    this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1,1)); 


    //create a GraphViewer and Graph 
    graphViewer = new GraphViewer(this, SWT.V_SCROLL | SWT.H_SCROLL); 
    graph = graphViewer.getGraphControl(); 
    graph.setLayoutAlgorithm(new TreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), true); 
    graph.setHorizontalScrollBarVisibility(Graph.ALWAYS); 
    graph.setVerticalScrollBarVisibility(Graph.ALWAYS); 


    //Fill our graph with some nodes and connect them 
    GraphNode node1 = new GraphNode(graph, SWT.NONE, "Earendil"); 
    GraphNode node2 = new GraphNode(graph, SWT.NONE, "Elros"); 
    GraphNode node3 = new GraphNode(graph, SWT.NONE, "Elrond"); 
    GraphNode node4 = new GraphNode(graph, SWT.NONE, "Elladan"); 
    GraphNode node5 = new GraphNode(graph, SWT.NONE, "Elrohir"); 
    GraphNode node6 = new GraphNode(graph, SWT.NONE, "Arwen"); 


    new GraphConnection(graph, ZestStyles.CONNECTIONS_DIRECTED, node1, node2); 
    new GraphConnection(graph, ZestStyles.CONNECTIONS_DIRECTED, node1, node3); 
    new GraphConnection(graph, ZestStyles.CONNECTIONS_DIRECTED, node2, node4); 
    new GraphConnection(graph, ZestStyles.CONNECTIONS_DIRECTED, node2, node5); 
    new GraphConnection(graph, ZestStyles.CONNECTIONS_DIRECTED, node2, node6); 

    /* 
    This graphViewer consists of 2 components: the control and the graph (Figure) 
    We want to give the control a size by the layout and the graph a custom, bigger value. 
    For the control (graphViewer.getControl) I simply grab all available space 
    */ 
    GridDataFactory.fillDefaults().grab(true, true).applyTo(graphViewer.getControl()); 

    //For the graph we have to create a PaintListener. 
    graph.addPaintListener(new PaintListener() { 

     @Override 
     public void paintControl(PaintEvent e) { 
     graph.setSize(1300, 1080); 

     } 
    }); 
    //The Graph now fills the shell/parent composite, 
    //but the actual graph size can be set as we want in the paint //listener 

    //Zooming with the class org.eclipse.gef.editparts.ZoomManager 
    //As arguments we need a ScalableFigure which we receive by graph.getRootLayer and the Viewport. 
    ZoomManager zoomManager = new ZoomManager(graph.getRootLayer(), graph.getViewport()); 

    //we bind the zoom mechanic to a simple mouse wheel listener 
    graph.addMouseWheelListener(new MouseWheelListener() { 

     @Override 
     public void mouseScrolled(MouseEvent e) { 
      if (e.count < 0) { 
       zoomManager.zoomOut(); 
      } else { 
       zoomManager.zoomIn(); 
      } 
     } 
    }); 
    //We give the focus to our graphViewer, so it receives the MouseWheel Events 
    graphViewer.getControl().forceFocus(); 
    } 

    @Override 
    protected void checkSubclass() { 
    //we are a composite subclass 
    } 

} 

Примечание: я не включил импорт