Question

I'm trying to add a button above the create two ScrolledComposites that scroll in tandem snippet from swt snippets

the problem is that if I put the example code in a different Composite than the shell the example not working

import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class tandemWithButton {

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new RowLayout());
        Button buttonAbove = new Button(shell, SWT.PUSH);
        buttonAbove.setText("Button Above");
        buttonAbove.setSize(40, 30);
        // shell.setContent (buttonAbove);

        Composite comp = new Composite(shell, SWT.NONE);
        comp.setLayout(new FillLayout());

        final ScrolledComposite sc1 = new ScrolledComposite(comp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        Button button1 = new Button(sc1, SWT.PUSH);
        button1.setText("Button 1");
        button1.setSize(400, 300);
        sc1.setContent(button1);

        final ScrolledComposite sc2 = new ScrolledComposite(comp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        Button button2 = new Button(sc2, SWT.PUSH);
        button2.setText("Button 2");
        button2.setSize(300, 400);
        sc2.setContent(button2);

        final ScrollBar vBar1 = sc1.getVerticalBar();
        final ScrollBar vBar2 = sc2.getVerticalBar();
        final ScrollBar hBar1 = sc1.getHorizontalBar();
        final ScrollBar hBar2 = sc2.getHorizontalBar();
        SelectionListener listener1 = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                int x = hBar1.getSelection() * (hBar2.getMaximum() - hBar2.getThumb()) / Math.max(1, hBar1.getMaximum() - hBar1.getThumb());
                int y = vBar1.getSelection() * (vBar2.getMaximum() - vBar2.getThumb()) / Math.max(1, vBar1.getMaximum() - vBar1.getThumb());
                sc2.setOrigin(x, y);
            }
        };
        SelectionListener listener2 = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                int x = hBar2.getSelection() * (hBar1.getMaximum() - hBar1.getThumb()) / Math.max(1, hBar2.getMaximum() - hBar2.getThumb());
                int y = vBar2.getSelection() * (vBar1.getMaximum() - vBar1.getThumb()) / Math.max(1, vBar2.getMaximum() - vBar2.getThumb());
                sc1.setOrigin(x, y);
            }
        };
        vBar1.addSelectionListener(listener1);
        hBar1.addSelectionListener(listener1);
        vBar2.addSelectionListener(listener2);
        hBar2.addSelectionListener(listener2);
        comp.pack();
        comp.setSize(400, 300);

        shell.setSize(400, 300);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

can someone please help me understand what am I doing wrong? how can I put the tandem scrollbars in a composite and add widgets above / below it. Thanks in advance, Yossi

Was it helpful?

Solution

Problem is in the RowLayout which does not reflect the size of parent component, so the Composite container gets that bounds it needs, though no scrollbars are necessary. Change the line with shell layout to shell.setLayout(new FillLayout()); and you'll get working demo with the button..

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top