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;}@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();}}}
}

扩展阅读

  1. idea开发jface、swt环境搭建
  2. Swt/Jface tableViewer入门教程一(显示tableViewer)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/207925.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一次解决套接字操作超时错误的过程

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 在windows客户端使用QTcpSocket连接一个ubuntu服务端程序,出现套接字操作超时的错误。开始感觉还莫名其妙的,因为之前连接都是好好…

c语言:用迭代法解决递归问题

题目&#xff1a; 解释&#xff1a;题目的意思就是用迭代法的空间和时间复杂的太高了&#xff0c;需要我们减小空间与时间的复杂度&#xff0c;我就想到了迭代法&#xff0c;思路和代码如下&#xff1a; #include <stdio.h> //这里是递归法转迭代法 int main() {int x,i…

14.(vue3.x+vite)组件间通信方式之pinia

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Pinia简介 Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 Pinia与Vuex比较 (1)Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。 (2)pinia中只有state、getter、action,抛弃了Vu…

在win10上安装pytorch-gpu版本2

安装anaconda即下载了python&#xff0c;还可以创建虚拟环境。 目录 1.1 anaconda安装 1.2 pytorch-gpu安装 1.1 Anaconda安装 anaconda的安装请看我之前发的tensoflow-gpu安装&#xff0c;里面有详细的安装过程&#xff0c;这里不做重复描述&#xff0c;传送门 1.2 pyt…

IP地址定位技术发展与未来趋势

随着互联网的快速发展&#xff0c;人们对网络的需求和依赖程度越来越高。在海量的网络数据传输中&#xff0c;IP地址定位技术作为网络安全与信息追踪的重要手段&#xff0c;其精准度一直备受关注。近年来&#xff0c;随着技术的不断进步&#xff0c;IP地址定位的精准度得到了显…

Java 最简单的实现 AES 加密和解密

AES简介 AES&#xff08;Advanced Encryption Standard&#xff09;高级加密标准&#xff0c;是一种被广泛使用的对称加密算法&#xff0c;用于加密和解密数据。它曾经是美国政府的一个机密标准&#xff0c;但现在已成为公开的加密算法&#xff0c;并被广泛使用于商业、政府及…

优秀智慧园区案例 - 上海世博文化公园智慧园区,先进智慧园区建设方案经验

一、项目背景 世博文化公园是上海的绿色新地标&#xff0c;是生态自然永续、文化融合创新、市民欢聚共享的大公园。作为世博地区的城市更新项目&#xff0c;世博文化公园的建设关乎上海城市风貌、上海文化展示、城市生态环境、市民游客体验、上海服务品牌等&#xff0c;被赋予…

【C语言】函数(二):函数调用与链式访问

目录 函数调用传值调用传址调用练习题 嵌套调用链式访问 函数调用 函数调用分为传值调用和传址调用 传值调用 传值调用时&#xff0c;函数的形参和实参分别有着自己的内存空间&#xff0c;形参的改变不会影响实参。在上文中说到的利用一个函数实现两个整数的交换的错误写法就是…

进程API

linux下进程的api forkwaitexec fork #include <stdio.h> #include <stdlib.h> #include <unistd.h>/* linux环境运行 子进程并不是完全拷贝了父进程。具体来说&#xff0c;虽然它拥有自己的 地址空间&#xff08;即拥有自己的私有内存&#xff09;、寄存器…

分布式锁3: zk实现分布式锁

一 zk 实现分布式锁 1.1 zk分布式操作命令 1.指令&#xff1a; ls / get /zookeeper create /aa "test" delete /aa set /aa "test1" 2..znode节点类型&#xff1a; 永久节点&#xff1a;create /pa…

人工智能-循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35…

【AI】行业消息精选和分析(11月22日)

今日动态 &#x1f453; Video-LLaVA&#xff1a;视觉语言模型革新&#xff1a; - 图像和视频信息转换为文字格式。 - 多模态理解能力&#xff0c;适用于自动问答系统等。 &#x1f4c8; 百度文心一言用户数达7000万&#xff1a; &#x1f50a; RealtimeTTS&#xff1a;实时文本…