前言
使用JFace
创建表格还是比较方便的, 如果仅仅是创建空表格的话, 以下2步即可完成:
- 创建
TableViewer
对象, 指定样式, 比如是否支持多行选择, 有无边框, 是否支持滚动条等 - 创建
TableColumn
对象: 包括列展示名称, 宽度和样式等, 最终绑定到table对象
实例
创建表格
//注意这里,SWT.MULTI代表可以选择多行,SWT.FULL_SELECTION代表可以整行选择,SWT.BORDER边框,SWT.V_SCROLL ,SWT.H_SCROLL滚动条
TableViewer tableViewer = new TableViewer(shell,SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);Table table = tableViewer.getTable();
// 表格边框线是否可见
table.setLinesVisible(true);
// 表头是否可见
table.setHeaderVisible(true);
// 设置表格大小
table.setBounds(97, 79, 373, 154);
String[] titles = {"ID", "姓名", "性别", "年龄"};
// 创建列头信息, 并最终绑定到table
Arrays.stream(titles).forEach(title -> TableColumnFactory.newTableColumn(SWT.NONE).width(80).text(title).create(table));
运行效果
添加数据
一般情况下我们会将表格数据映射为对象列表, 比如我们有一个叫People
的类, 它的属性与表中的列一一对应:
public class People {private int id;private String name;private String sex;private int age;
}
我们需要将一个People
列表作为原始数据渲染到表格当中, 关键步骤:
- 接收源数据数组(也可以是单个对象或者其他集合类型):
TableViewer.setInput(Object)
- 渲染接收的数据
- 渲染表头:
TableViewer.setLabelProvider(IBaseLabelProvider)
- 渲染内容:
TableViewer.setContentProvider(IContentProvider)
- 渲染表头:
在实际开发当中步骤刚好相反, 先提供渲染逻辑, 然后再输入数据:
tableViewer.setContentProvider(PeoplesProvider.getInstance());
tableViewer.setLabelProvider(PeopleLabelProvider.getInstance());People people = new People();
people.setId(1);
people.setName("张三");
people.setSex("男");
people.setAge(10);
tableViewer.setInput(new People[]{people});
- 由于
LabelProvider
和ContentProvider
逻辑是通用的, 所以采用了单例模式- 由于是演示, 这里仅提供了包含单个
People
实例的数组, 实际当中可能是很大的一个列表或其他数据类型
PeoplesProvider
我们直接继承IStructuredContentProvider
:
import org.eclipse.jface.viewers.IStructuredContentProvider;public class PeoplesProvider implements IStructuredContentProvider {private static final PeoplesProvider provider = new PeoplesProvider();public static PeoplesProvider getInstance() {return provider;}@Overridepublic Object[] getElements(Object inputElement) {if (inputElement instanceof People[] objects) {return objects;}return new Object[0];}
}
注意getElements方法中的数据类型转换, 决定了输入的数据类型是什么, 此处我们使用
People[]
接收和解析, 所以在设置数据源的地方也输入同类型的数据tableViewer.setInput(People[]);
PeopleLabelProvider
我们继承LabelProvider
并实现ITableLabelProvider
:
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;public class PeopleLabelProvider extends LabelProvider implements ITableLabelProvider {private final static PeopleLabelProvider provider = new PeopleLabelProvider();private PeopleLabelProvider() {}public static PeopleLabelProvider getInstance() {return provider;}@Overridepublic Image getColumnImage(Object element, int columnIndex) {return null;}@Overridepublic String getColumnText(Object element, int columnIndex) {if (!(element instanceof People people)) {return "";}return switch (columnIndex) {case 0 -> String.valueOf(people.getId());case 1 -> people.getName();case 2 -> people.getSex();case 3 -> String.valueOf(people.getAge());default -> throw new IllegalStateException("Unexpected value: " + columnIndex);};}
}
运行效果
源码
Main
:
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.widgets.TableColumnFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;import java.util.Arrays;public class Main {/*** 1. 创建TableViewer对象, 指定样式, 比如是否支持多行选择, 有无边框, 是否支持滚动条等* 2. 创建TableColumn对象: 包括列展示名称, 宽度和样式等, 最终绑定到table对象** @param args*/public static void main(String[] args) {final Display display = Display.getDefault();final Shell shell = new Shell();shell.setLayout(new FillLayout());shell.setSize(500, 375);shell.setText("SWT Application");//注意这里,SWT.MULTI代表可以选择多行,SWT.FULL_SELECTION代表可以整行选择,SWT.BORDER边框,SWT.V_SCROLL ,SWT.H_SCROLL滚动条TableViewer tableViewer = new TableViewer(shell,SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);Table table = tableViewer.getTable();// 表格边框线是否可见table.setLinesVisible(true);// 表头是否可见table.setHeaderVisible(true);// 设置表格大小table.setBounds(97, 79, 373, 154);String[] titles = {"ID", "姓名", "性别", "年龄"};// 创建列头信息, 并最终绑定到tableArrays.stream(titles).forEach(title -> TableColumnFactory.newTableColumn(SWT.NONE).width(80).text(title).create(table));tableViewer.setContentProvider(PeoplesProvider.getInstance());tableViewer.setLabelProvider(PeopleLabelProvider.getInstance());People people = new People();people.setId(1);people.setName("张三");people.setSex("男");people.setAge(10);tableViewer.setInput(new People[]{people});shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}}
}
扩展阅读
- idea开发jface、swt环境搭建
- Swt/Jface tableViewer入门教程一(显示tableViewer)