问题
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
回答1:
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..
来源:https://stackoverflow.com/questions/14577749/swt-tandem-scrollbars-in-composite