Set ScrollableComposite position to location

2019-08-01 21:03发布

问题:

Using the SWT ScrollableComposite, is there an easy way in which to set the scrollbar position to jump in such a way that a particular element will be positioned at the top?

For example, if I had such a composite filled with 26 labels going down with the letters of the alphabet in order:

...then, say that I want to set my view to the "J" label and have the scrollbar position set like this:

(This is only example - if I really wanted to do what I am describing here, I would clearly just use a listbox or a table for my letters instead.)

This is similar to how Internet Browsers work when jumping to a specific tag within a page.

This can likely be done with a bunch of manual measurement calculations, if necessary, but my hope is that something simpler exists.

回答1:

I believe you are looking for below method on ScrolledComposite

  org.eclipse.swt.custom.ScrolledComposite.showControl(Control) //make it visible in view port

   org.eclipse.swt.custom.ScrolledComposite.setOrigin(Point) //sets left corner coordinates, read SWT docs

Updated Answer:

public static void main(String[] args) {
    Display display = new Display();

    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    Map<String,Control> controlMap = new HashMap<String,Control>();
    final ScrolledComposite scrollComposite = new ScrolledComposite(shell,
        SWT.V_SCROLL | SWT.BORDER);

    final Composite parent = new Composite(scrollComposite, SWT.NONE);
    for (int i = 0; i <= 50; i++) {
      Label label = new Label(parent, SWT.NONE);
      String index = String.valueOf(i);
      controlMap.put(index, label);
      label.setText(index);
    }
    GridLayoutFactory.fillDefaults().numColumns(1).applyTo(parent);

    scrollComposite.setContent(parent);
    scrollComposite.setExpandVertical(true);
    scrollComposite.setExpandHorizontal(true);
    scrollComposite.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent e) {
        Rectangle r = scrollComposite.getClientArea();
        scrollComposite.setMinSize(parent.computeSize(r.width,
            SWT.DEFAULT));
      }
    });

    shell.open();

    Control showCntrl = controlMap.get(String.valueOf(5));
    if(showCntrl != null){
      scrollComposite.setOrigin(showCntrl.getLocation());
    }
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    display.dispose();
  }