使用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;
}
@Override
public 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;
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public 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", "姓名", "性别", "年龄"};
// 创建列头信息, 并最终绑定到table
Arrays.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();
}
}
}
}