简体   繁体   English

Jface:如何强制Listviewer调整大小

[英]Jface: How to force Listviewer to resize

how can I force a Listviewer to update the size? 如何强制Listviewer更新大小? When I'm adding an element to the list which is longer then the existing size, the listviewer should expand: 当我向列表中添加一个比现有大小更长的元素时,listviewer应该展开:

在此处输入图片说明

I update the Listviewer in this way: 我以这种方式更新Listviewer:

lvConstraints.refresh();

Are you sure it is a good idea, to resize it after content is added? 您确定添加内容后调整大小是个好主意吗? IMO, expanding and collapsing at runtime, causes pretty bad user experience. IMO在运行时扩展和崩溃会导致非常糟糕的用户体验。 Can't you think of an average width of elements, containing inside the viewer? 您无法考虑查看器内部包含的元素的平均宽度吗? For Longer elements I'd suggest you use scrolling functionality. 对于较长的元素,建议您使用滚动功能。

If you still want to change size of a viwer after element is added you can do it like this: 如果您仍想在添加元素后更改viwer的大小,可以执行以下操作:

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

Example: 例:

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();

    }

}

To show a vertical scrollbar, create viewer with SWT.V_SCROLL style: like this: 要显示垂直滚动条,请创建具有SWT.V_SCROLL样式的查看器:

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

To prevent resizing more, then specific height, use height hint, when computing size and do it as follows (note, that you can provide width hint as well, to prevent resizing more, then specific width) ( NOTE: : pack() method was removed): 为了防止再调整大小,然后再调整特定的高度,请在计算尺寸时使用高度提示,并按以下步骤进行操作(注意,您也可以提供宽度提示,以防止再调整大小,然后再调整具体宽度)( 注意 ::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