【SWT】组件 ScrolledComposite 滚动内容充满所有滚动区

目的

通常写的滚动面板中的滚动区内容并没有充满整个可滚动区,如图一所示:
在这里插入图片描述
图一中,红色即滚动区,蓝色是滚动区中的item。代码片段详见未填充章节。

本文介绍如何根据需要使得滚动面板中的内容横向和纵向分别填充,如下图所示:
在这里插入图片描述

图二中,红色即滚动区,蓝色是滚动区中的item。与图一比较,很明显,红色滚动区填充了整个面板,蓝色紧随滚动区做了横向满填充。代码片段详见满填充章节。

实践

未填充


import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import com.xzbd.swt01.utils.SWTResourceManager;

public class ScrolledCompositeTest {
	
	public static void main(String[] args) {
		final Display display = new Display();
		final Shell shell = new Shell(display);
		shell.setText("滑动面板");
		shell.setLayout(new FillLayout());
		Composite contaniner = new Composite(shell, SWT.NONE);
		contaniner.setLayout(new FillLayout());

		// 滑动面板
		ScrolledComposite sc = new ScrolledComposite(contaniner, SWT.H_SCROLL | SWT.V_SCROLL);

		Composite content = new Composite(sc, SWT.None);
		content.setLayout(new GridLayout());
		content.setBackground(SWTResourceManager.getColor(SWT.COLOR_RED));
		for (int i = 0; i < 100; i++) {
			Composite row = new Composite(content, SWT.NONE);
			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
			row.setLayoutData(gridData);
			row.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
			
		}

		
		// 设置滑动内容
		sc.setContent(content);
		content.setSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		// sc 重新绘制,否则不显示 滑动内容
		sc.layout();

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


满填充


import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import com.xzbd.swt01.utils.SWTResourceManager;

public class ScrolledCompositeTest {
	
	public static void main(String[] args) {
		final Display display = new Display();
		final Shell shell = new Shell(display);
		shell.setText("滑动面板");
		shell.setLayout(new FillLayout());
		Composite contaniner = new Composite(shell, SWT.NONE);
		contaniner.setLayout(new FillLayout());

		// 滑动面板
		ScrolledComposite sc = new ScrolledComposite(contaniner, SWT.H_SCROLL | SWT.V_SCROLL);

		Composite content = new Composite(sc, SWT.None);
		content.setLayout(new GridLayout());
		content.setBackground(SWTResourceManager.getColor(SWT.COLOR_RED));
		for (int i = 0; i < 100; i++) {
			Composite row = new Composite(content, SWT.NONE);
			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
			row.setLayoutData(gridData);
			row.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
			
		}

		sc.setExpandHorizontal(true);
		sc.setExpandVertical(true);
		sc.addControlListener(ControlListener.controlResizedAdapter(e -> {
			Rectangle r = sc.getClientArea();
			sc.setMinSize(content.computeSize(r.width, SWT.DEFAULT));
		}));
		
		// 设置滑动内容
		sc.setContent(content);
		content.setSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		// sc 重新绘制,否则不显示 滑动内容
		sc.layout();

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


总结

未填充满填充 章节对比,主要代码差异如下:


		sc.setExpandHorizontal(true);
		sc.setExpandVertical(true);
		sc.addControlListener(ControlListener.controlResizedAdapter(e -> {
			Rectangle r = sc.getClientArea();
			sc.setMinSize(content.computeSize(r.width, SWT.DEFAULT));
		}));
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值