簡體   English   中英

Jface:如何強制Listviewer調整大小

[英]Jface: How to force Listviewer to resize

如何強制Listviewer更新大小? 當我向列表中添加一個比現有大小更長的元素時,listviewer應該展開:

在此處輸入圖片說明

我以這種方式更新Listviewer:

lvConstraints.refresh();

您確定添加內容后調整大小是個好主意嗎? IMO在運行時擴展和崩潰會導致非常糟糕的用戶體驗。 您無法考慮查看器內部包含的元素的平均寬度嗎? 對於較長的元素,建議您使用滾動功能。

如果您仍想在添加元素后更改viwer的大小,可以執行以下操作:

viewer.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT);
viewer.getControl().pack();

例:

public class Test {

    private class MyContentProvider implements IStructuredContentProvider {

        @Override
        public Object[] getElements(Object inputElement) {
            return ((List) inputElement).toArray(new MyModel[0]);
        }

        @Override
        public void dispose() {
        }

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

    }

    public class MyModel {
        public String counter;

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

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

    public Test(Shell shell) {
        // final TableViewer v = new TableViewer(shell);
        Composite c = new Composite(shell, SWT.NONE);
        GridLayoutFactory.swtDefaults().applyTo(c);
        GridDataFactory.defaultsFor(c).hint(100, 100).applyTo(c);

        final ListViewer v = new ListViewer(c);
        // v.setSize(200, 300);
        v.setLabelProvider(new LabelProvider());
        // for demonstration purposes use custom content provider
        // alternatively you could use ArrayContentProvider.getInstance()
        v.setContentProvider(new MyContentProvider());
        v.setComparator(new ViewerComparator());
        v.setInput(createModel());

        GridDataFactory.defaultsFor(v.getControl()).align(SWT.BEGINNING, SWT.TOP).hint(100, 100).grab(true, true)
            .applyTo(v.getControl());
        // v.getTable().setLinesVisible(true);

        Button b = new Button(c, SWT.NONE);
        b.setText("button");
        b.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                int nextInt = RandomUtils.nextInt(100);
                String s = "";
                for (int i = 0; i < nextInt; i++) {
                    s += "" + i;
                }
                // v.add(new MyModel(s));
                ((List) v.getInput()).add(new MyModel(s));
                v.refresh();
                v.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT);
                v.getControl().pack();
            }
        });
    }

    private List<MyModel> createModel() {
        List<MyModel> elements = new ArrayList<Test.MyModel>();

        for (int i = 0; i < 10; i++) {
            elements.add(new MyModel("" + i));
        }

        return elements;
    }

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        new Test(shell);
        shell.open();

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

        display.dispose();

    }

}

要顯示垂直滾動條,請創建具有SWT.V_SCROLL樣式的查看器:

final ListViewer v = new ListViewer(c, SWT.V_SCROLL);

為了防止再調整大小,然后再調整特定的高度,請在計算尺寸時使用高度提示,並按以下步驟進行操作(注意,您也可以提供寬度提示,以防止再調整大小,然后再調整具體寬度)( 注意 ::pack()方法去掉了):

v.refresh();
Point computeSize = v.getControl().computeSize(SWT.DEFAULT, 200);
v.getList().setSize(computeSize);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM