代码之家  ›  专栏  ›  技术社区  ›  NullPointerException

添加元素时,如何将ScrolledComposite的滚动条移至底部?

  •  0
  • NullPointerException  · 技术社区  · 3 年前

    有一个 ScrolledComposite ,通过在其中添加更多按钮的按钮,可以在添加新项时始终将垂直滚动条移动到底部。

    如何做到这一点?这是将按钮添加到 滚动合成 :

    public boolean open() {     
        shell = new Shell(getParent(), getStyle());
        shell.setText(getText());
        
        GridLayout gl_shell = new GridLayout(1, false);
        gl_shell.marginWidth = 20;
        shell.setLayout(gl_shell);
        
        final ScrolledComposite sc1 = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        final Composite c1 = new Composite(sc1, SWT.NONE);
        sc1.setContent(c1);
        final GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        c1.setLayout(layout);
        final Button b1 = new Button (c1, SWT.PUSH);
        b1.setText("first button");
        c1.setSize(200,200);
    
        final Button add = new Button(shell, SWT.PUSH);
        add.setText("add children");
        final int[] index = new int[]{0};
        add.addListener(SWT.Selection, new Listener() {
            public void handleEvent(final Event e) {
                index[0]++;
                final Button button = new Button(c1, SWT.PUSH);
                button.setText("button "+index[0]);
                // reset size of content so children can be seen - method 1
                c1.setSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
                c1.layout();
            }
        });
        
        
        shell.layout();
        shell.pack(); //for wrap the dialog size to it's content width and height.
        
        //the dialog must be centered after doing shell.pack();
        Rectangle parentSize = getParent().getBounds();
        Rectangle shellSize = shell.getBounds();
        int x = parentSize.x + (parentSize.width - shellSize.width) / 2;
        int y = (int) (parentSize.y + (parentSize.height - shellSize.height) / 3.5);
        shell.setLocation(new Point(x, y));
        shell.open(); //we put this after setLocation() and pack() because we don't want to see the shell on the original position for some milliseconds
        
        Display display = getParent().getDisplay();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        
        
        return false;
    }
    
    0 回复  |  直到 3 年前
        1
  •  1
  •   greg-449    3 年前

    ScrolledComposite 有一个

    public void showControl(Control control)
    

    确保控件方法可见。

    还有

    public void setShowFocusedControl(boolean show)
    

    showControl ).