• 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));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行效果

    在这里插入图片描述

    添加数据

    一般情况下我们会将表格数据映射为对象列表, 比如我们有一个叫People的类, 它的属性与表中的列一一对应:

    public class People {
        private int id;
        private String name;
        private String sex;
        private int age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们需要将一个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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    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];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意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);
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    运行效果

    在这里插入图片描述

    源码

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    扩展阅读

    1. idea开发jface、swt环境搭建
    2. Swt/Jface tableViewer入门教程一(显示tableViewer)
  • 相关阅读:
    荣耀进击背后的「韧性力量」
    Pytorch plt.scatter()函数用法
    正方形(c++题解)
    前端设计之03_接口文档
    MSYS2 + GCC + CMAKE环境搭建
    http2 mTLS代理搭建与远程端口转发(gost)
    WebRTC学习笔记五 SDP(Session Description Protocol)
    redis中使用lua脚本
    计算机毕业设计之java+springboot基于vue的网吧管理系统
    《Java极简设计模式》第08章:外观模式(Facade)
  • 原文地址:https://blog.csdn.net/Young4Dream/article/details/134559695