Как прокрутить ZEST Graph в его оболочке

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

мой график ZEST

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

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

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

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


person tassadarius    schedule 16.12.2016    source источник
comment
Если вы считаете, что ответ решил проблему, отметьте его как «принятый», нажав зеленую галочку. Это помогает сосредоточить внимание на старых сообщениях, на которые до сих пор нет ответов.   -  person Rüdiger Herrmann    schedule 19.12.2016


Ответы (3)


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

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

person Rüdiger Herrmann    schedule 16.12.2016
comment
Спасибо за awnser, мне действительно удалось заставить его работать со смесью Composite и SashForm, и я опубликую код, когда он будет готов. - person tassadarius; 23.12.2016

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

Graph graph = new Graph(shell, SWT.H_SCROLL | SWT.V_SCROLL);
person Baz    schedule 16.12.2016
comment
Это действительно не работает. Да, график становится прокручиваемым, но он получает пространство, выделенное из GridLayout, которое он не расширяет. Таким образом, график просто остается в своих границах и его можно прокручивать, но он не получает больше места. - person tassadarius; 23.12.2016

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

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

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
   }

}

Примечание. Я не включал импорт

person tassadarius    schedule 19.03.2017