问题
What I tried so far:
In createPartControl:
ScrolledComposite sc = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
sc.setLayoutData(new GridData(GridData.FILL_BOTH));
sc.setExpandVertical(true);
sc.setExpandHorizontal(true);
sc.setSize(ApplicationWorkbenchWindowAdvisor.WIDTH, ApplicationWorkbenchWindowAdvisor.HEIGHT);
final TabFolder tabFolder = new TabFolder(sc, SWT.TOP);
but this does not work. My problem is that if I resize my program window the scrollbars does not appear in my view. Any ideas?
回答1:
The Javadoc of ScrolledComposite describes the two ways to use it, including example code. To sum them up:
- You either set the size of the control/composite contained in your
ScrolledCompositeon the control/composite itself - Or you tell your
ScrolledCompositethe minimum size to use for its content.
Currently, you're doing neither. You're setting the size on the ScrolledComposite, but unless you don't use a layout manager, that doesn't make much sense. In any case, see the above link for some official example code.
回答2:
Typically in Eclipse views, I want my controls to grab all available space, and only show scrollbars, if otherwise a control would shrink below a usable size.
The other answers are perfectly valid, but I wanted to add a full example of a createPartControl method (Eclipse e4).
@PostConstruct
public void createPartControl(Composite parent) {
ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
Composite composite = new Composite(sc, SWT.NONE);
sc.setContent(composite);
composite.setLayout(new GridLayout(2, false));
Label label = new Label(composite, SWT.NONE);
label.setText("Foo");
Text text = new Text(composite, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI);
GridDataFactory.fillDefaults().grab(true, true).hint(400, 400).applyTo(text);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
}
Note that .fillDefaults() implies .align(SWT.FILL, SWT.FILL).
I commonly use this pattern, so I created the following little helper method:
public static ScrolledComposite createScrollable(Composite parent, Consumer<Composite> scrollableContentCreator) {
ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
Composite composite = new Composite(sc, SWT.NONE);
sc.setContent(composite);
scrollableContentCreator.accept(composite);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
return sc;
}
Thanks to Java 8 lambdas, you can now implement new scrollable composites in a very compact way:
createScrollable(container, composite -> {
composite.setLayout(new FillLayout());
// fill composite with controls
});
回答3:
This is a small piece of code which worked for me:
ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
Composite composite = new Composite(sc, SWT.NONE);
sc.setContent(composite);
Label lblRelation = new Label(composite, SWT.NONE);
lblRelation.setBounds(10, 13, 74, 15);
lblRelation.setText("Label name:");
composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
来源:https://stackoverflow.com/questions/7791696/how-do-i-make-a-view-scrollable-in-an-eclipse-rcp-application