如何实现ScrolledComposite下 控件个数随着窗口大小自动变化

时间:2021-01-10 22:23:51

如何实现ScrolledComposite下 控件个数随着窗口大小自动变化


参考http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CreateaScrolledCompositewithwrappingcontent.htm


public class Snippet166 {

	public static void main(String[] args) {
		Display display = new Display();
		Image image1 = display.getSystemImage(SWT.ICON_WORKING);
		Image image2 = display.getSystemImage(SWT.ICON_QUESTION);
		Image image3 = display.getSystemImage(SWT.ICON_ERROR);

		Shell shell = new Shell(display);
		shell.setLayout(new FillLayout());

		final ScrolledComposite scrollComposite = new ScrolledComposite(shell,
				SWT.V_SCROLL | SWT.BORDER);

		final Composite parent = new Composite(scrollComposite, SWT.NONE);
		for (int i = 0; i <= 200; i++) {
			Label label = new Label(parent, SWT.NONE);
			if (i % 3 == 0)
				label.setImage(image1);
			if (i % 3 == 1)
				label.setImage(image2);
			if (i % 3 == 2)
				label.setImage(image3);
		}
		RowLayout layout = new RowLayout(SWT.HORIZONTAL);
		layout.wrap = true;
		parent.setLayout(layout);

		scrollComposite.setContent(parent);
		scrollComposite.setExpandVertical(true);
		scrollComposite.setExpandHorizontal(true);

		//方法1:
		// 一般使用这种方法根据子控件来计算得到大小,但是这里如果用此方法无法实现自动换行
		// scrollComposite.setMinSize(parent.computeSize(SWT.DEFAULT,
		// SWT.DEFAULT));

		//方法2:
		// 这种方法不仅参考子控件还根据父控件分配的空间来计算大小,getClientArea就是获取scrollComposite面板区域大小,然后把这个宽度设置到parent里,computeSize这句话估计有设置parent的宽高的作用,可以实现自动换行
		scrollComposite.addControlListener(new ControlAdapter() {
			public void controlResized(ControlEvent e) {
				Rectangle r = scrollComposite.getClientArea();

				scrollComposite.setMinSize(parent.computeSize(r.width,
						SWT.DEFAULT));
			}
		});

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