2017-01-11 2 views
0

ScrolledCompositeにある大きな表ビューアを持つダイアログがあります。 TableViewerから項目を選択するには、ScrollledCompositeをプログラムでスクロールする必要があります。 簡単な作業のように見えますが、実際にはスタックがあります。 私は思考の数を試して、彼らのうちの何人も働いていません。ScrollledCompositeをプログラムでスクロールするTableViewerの項目

私のサンプルコードがあります:

import org.eclipse.jface.viewers.ArrayContentProvider; 
import org.eclipse.jface.viewers.LabelProvider; 
import org.eclipse.jface.viewers.TableViewer; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.custom.ScrolledComposite; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.TableItem; 

/** 
* Scroll a Viewer 99th element 
* 
*/ 
public class Snippet008RevealElement { 

public class MyModel { 
    public int counter; 

    public MyModel(int counter) { 
     this.counter = counter; 
    } 

    @Override 
    public String toString() { 
     return "Item " + this.counter; 
    } 
} 

public Snippet008RevealElement(Shell shell) { 
    ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.H_SCROLL); 

    GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); 
    scrolledComposite.setLayoutData(data); 

    scrolledComposite.setExpandHorizontal(true); 
    scrolledComposite.setExpandVertical(true); 

    Composite main = new Composite(scrolledComposite, SWT.NONE); 
    main.setLayout(new GridLayout()); 
    main.setLayoutData(new GridData(GridData.FILL_BOTH)); 


    final TableViewer v = new TableViewer(main); 
    v.setLabelProvider(new LabelProvider()); 
    v.setContentProvider(ArrayContentProvider.getInstance()); 
    MyModel[] model = createModel(); 
    v.setInput(model); 
    v.getTable().setLinesVisible(true); 

//  v.reveal(model[99]); 
//  v.getTable().setSelection(99); 

    TableItem[] items = v.getTable().getItems(); 
    TableItem item = items[99]; 
    scrolledComposite.getVerticalBar().setSelection(item.getBounds().y); 

    scrolledComposite.setContent(main); 
    scrolledComposite.setMinSize(main.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
} 

private MyModel[] createModel() { 
    MyModel[] elements = new MyModel[100]; 

    for(int i = 0; i < 100; i++) { 
     elements[i] = new MyModel(i); 
    } 

    return elements; 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 
    new Snippet008RevealElement(shell); 
    shell.open(); 

    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) display.sleep(); 
    } 

    display.dispose(); 

} 

}

真の課題やバグが表項目項目=項目[99]のための本当の境界を見つけることです。コンポジットには表示されません。

次のようなもの使用して、このために ScrolledCompositesetOrigin方法を使用することができます

答えて

2

scrolledComposite.setContent(main); 
scrolledComposite.setMinSize(main.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 

// Need to run the calculations after all size calculations have been done 
// So do asynchronously. 

final Display display = scrolledComposite.getDisplay(); 

display.asyncExec(() -> 
{ 
    final Table table = v.getTable(); 

    final TableItem item = table.getItem(99); 

    Rectangle itemBounds = item.getBounds(); 

    // Convert to be relative to scrolled composite 

    itemBounds = display.map(viewer.getTable(), scrolledComposite, itemBounds); 

    scrolledComposite.setOrigin(0, itemBounds.y); 
}); 

注:私はそれがあることが示されているように、あなたがコントロールの初期化中にこのコードを呼び出す場合は境界の計算が正確ではありませんがここで非同期に行われます。ボタンなどからコードを実行する場合は、asyncExecは必要ありません。

関連する問題