目的
通常写的滚动面板中的滚动区内容并没有充满整个可滚动区,如图一所示:
图一中,红色即滚动区,蓝色是滚动区中的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));
}));