SWT/Jface(1): 表格的创建和渲染

前言

使用JFace创建表格还是比较方便的, 如果仅仅是创建空表格的话, 以下2步即可完成:

  1. 创建TableViewer对象, 指定样式, 比如是否支持多行选择, 有无边框, 是否支持滚动条等
  2. 创建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列表作为原始数据渲染到表格当中, 关键步骤:

  1. 接收源数据数组(也可以是单个对象或者其他集合类型): TableViewer.setInput(Object)
  2. 渲染接收的数据
    1. 渲染表头: TableViewer.setLabelProvider(IBaseLabelProvider)
    2. 渲染内容: 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});
  1. 由于LabelProviderContentProvider逻辑是通用的, 所以采用了单例模式
  2. 由于是演示, 这里仅提供了包含单个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();
            }
        }
    }
}

扩展阅读

  1. idea开发jface、swt环境搭建
  2. Swt/Jface tableViewer入门教程一(显示tableViewer)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值