2014-01-22 2 views
1

ScrolledComposite 스크롤을 상단의 지정된 컨트롤을 표시하도록하려면 어떻게해야합니까?ScrolledComposite의 setOrigin 메서드 사용

이전 질문에 대한 답변은 how to make a ScrolledComposite programmatically scroll to a child control입니다. 주어진 조언은 setOrigin 메소드를 사용하는 것과 같이 개념적으로 시도하는 방법에 대한 아이디어를 주었지만, 주어진 예제 나 자신의 함수를 제대로 사용할 수 없었습니다. 여기에 지금까지 구축 한 것입니다 :

I는 다음과 같다 쉘을 만들었습니다 : enter image description here 나는 1-500에서 라벨의 무리가 있고, 내가 원하는 특정 버튼의 무리가 ScrolledComposite은과 같이, 각각의 라벨에 중심을 일으킬 :

다음

enter image description here

코드입니다 :

import java.util.HashMap; 

public class ScrollableTest2 extends Shell { 

    private static final int NUM_OF_LABELS = 500; 
    private static final int[] SEEKABLES = new int[] {0, 9, 23, 99, 175, 176, 177, 178, 350, 495, 499}; 

    Map<Integer, Control> controlMap = new HashMap<Integer, Control>(); 

    private Composite cmpButtons; 
    private Label vr; 
    private ScrolledComposite scroller; 
    private Composite cmpScrollInner; 

    /** 
    * Launch the application. 
    * @param args 
    */ 
    public static void main(String args[]) { 
     try { 
      Display display = Display.getDefault(); 
      ScrollableTest2 shell = new ScrollableTest2(display); 
      shell.layout(); 
      shell.open(); 
      while (!shell.isDisposed()) { 
       if (!display.readAndDispatch()) { 
        display.sleep(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Create the shell. 
    * @param display 
    */ 
    public ScrollableTest2(Display display) { 
     super(display, SWT.SHELL_TRIM); 
     createContents(); 
    } 

    /** 
    * Create contents of the shell. 
    */ 
    protected void createContents() { 
     setSize(400, 400); 
     setText("SWT Application"); 
     GridLayout gridLayout = new GridLayout(); 
     gridLayout.numColumns = 3; 
     setLayout(gridLayout); 

     cmpButtons = new Composite(this, SWT.NONE); 
     cmpButtons.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); 
     cmpButtons.setLayout(new GridLayout(1, false)); 

     for (int seekable : SEEKABLES) { 
      Button button = new Button(cmpButtons, SWT.NONE); 
      button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); 
      button.setText("Go To " + String.valueOf(seekable+1)); 

      final int index = seekable; 
      button.addSelectionListener(new SelectionAdapter() { 
       @Override 
       public void widgetSelected(SelectionEvent e) { 
        seekToLabel(index); 
       } 
      }); 
     } 

     vr = new Label(this, SWT.SEPARATOR | SWT.VERTICAL); 
     vr.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true, 1, 1)); 

     scroller = new ScrolledComposite(this, SWT.BORDER | SWT.V_SCROLL); 
     scroller.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); 
     scroller.setExpandHorizontal(true); 
     scroller.setExpandVertical(true); 

     cmpScrollInner = new Composite(scroller, SWT.NONE); 
     cmpScrollInner.setLayout(new GridLayout(1, false)); 

     scroller.setContent(cmpScrollInner); 

     for (int i = 0; i < NUM_OF_LABELS; i++) { 
      Label label = new Label(cmpScrollInner, SWT.NONE); 
      label.setText("Label " + String.valueOf(i+1)); 
     } 

     scroller.setMinSize(cmpScrollInner.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
     scroller.setContent(cmpScrollInner); 
     scroller.addControlListener(new ControlAdapter() { 
      public void controlResized(ControlEvent e) { 
       Rectangle r = scroller.getClientArea(); 
       scroller.setMinSize(cmpScrollInner.computeSize(r.width, 
         SWT.DEFAULT)); 
      } 
     }); 

    } 

    @Override 
    protected void checkSubclass() { 
     // Disable the check that prevents subclassing of SWT components 
    } 

    protected void seekToLabel(int index) { 
     Control showCntrl = controlMap.get(new Integer(index)); 
     if(showCntrl != null){ 
      scroller.setOrigin(showCntrl.getLocation()); 
     } 
    } 

} 

이 버튼은 전혀 아무것도하지 않는 것, 비록 내가 청취자를 올바르게 세우고 있다고 믿지만. setOrigin 명령을 잘못 사용한다고 가정해야합니다. 내가 뭘 놓치고 있니?

+1

나는 내 자신의 대답을 알아 냈고, 그것은 정말 바보 같은 실수였습니다. –

답변

1

Neeeeevermind! 밝혀졌습니다. 컨트롤 맵에 컨트롤을 추가하는 것을 잊었습니다. 일단 그렇게하면 완벽하게 작동합니다.

for (int i = 0; i < NUM_OF_LABELS; i++) { 
     Label label = new Label(cmpScrollInner, SWT.NONE); 
     label.setText("Label " + String.valueOf(i+1)); 
     controlMap.put(new Integer(i), label); 
    } 

결국 어리석은 실수였습니다.