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.mzph.cn/news/159873.shtml

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

相关文章

c语言中使用openssl对rsa私钥解密

单次加密数据的最大长度(block_len),由RSA秘钥模长RSA_size()和填充模式有关 填充模式:RSA_PKCS1_PADDING, block_lenRSA_size() - 11填充模式:RSA_PKCS1_OAEP_PADDING,block_lenRSA_size() - 4…

设计模式-学习总结

学习总结 本文仅供自我学习使用 我是一个小白设计模式一.创建型模式1.单例模式(1).饿汉式(2).懒汉式,双检锁(3).静态内部类(4).枚举 2.原型模式3.工厂模式(1).简单工厂模式 4.抽象工厂模式5.建造者模式 二.结构型模式6.适配器模式7.组合模式8.装饰器模式9.外观模式1…

Spring国际化笔记整理

resources/message中添加hello.properties配置user.nameUserName {0}resources/message中添加hello_zh_CN.properties配置user.name用户名 {0}添加单元测试Slf4j public class MessageSourceTest {Testpublic void message(){Locale locale LocaleContextHolder.getLocale();S…

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

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

shell之read命令

shell之read命令 简介例子 简介 Linux的read命令用于从标准输入读取数据。它通常用于在shell脚本中读取用户的输入并将其分配给变量。 read命令的语法如下: read [-options] [variable]read命令的选项包括: -d:指定输入行的结束标志。 -p…

SpringBoot : ch06 整合 web (一)

前言 SpringBoot作为一款优秀的框架,不仅提供了快速开发的能力,同时也提供了丰富的文档和示例,让开发者更加容易上手。在本博客中,我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术,并通过实例代码来演示如何…

独立按键程序

/*----------------------------------------------- 内容&#xff1a;切换到独立按键模式&#xff0c;通过按键在数码管显示对应的数字 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff…

《微信小程序案例大全》大学生期末大作业可以直接使用!!

前言 在大学生活中&#xff0c;期末大作业是锻炼和展示自己所学知识的重要时刻。微信小程序作为一种快速、便捷的应用开发方式&#xff0c;成为了大学生开发实践的热门选择。本文将为大家推荐一系列可以直接使用的微信小程序案例&#xff0c;包括仿真社交、图书管理、学习工具…

电子元器件

目录 前言一、电阻 前言 本篇只介绍低功率元器件&#xff0c;电源等大功率元器件不做介绍 一、电阻

接口自动化测试实战经验分享,测试用例也能自动生成

作为测试&#xff0c;你可能会对以下场景感到似曾相识&#xff1a;开发改好的 BUG 反复横跳&#xff1b;版本兼容逻辑多&#xff0c;修复一个 BUG 触发了更多 BUG&#xff1b;上线时系统监控毫无异常&#xff0c;过段时间用户投诉某个页面无数据&#xff1b;改动祖传代码时如履…

CentOS 7 使用pugixml 库

安装 pugixml Git下载地址&#xff1a;https://github.com/zeux/pugixml 步骤1&#xff1a;首先&#xff0c;你需要下载pugixml 的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2&#xff1a;下载完成后&#xff0c;需要将源代码解压…

利用QRCode.js生成动态二维码页面

文章目录 QRCode.js简介HTML结构JavaScript生成动态二维码拓展功能1. 联系信息二维码2. Wi-Fi网络信息二维码 总结 &#x1f389;利用QRCode.js生成动态二维码页面 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏…

mysql 存储引擎ROWS与实际行数不一致

引言 在使用 MySQL 数据库时&#xff0c;我们经常会用到 SHOW TABLE STATUS 命令来获取表的统计信息&#xff0c;其中包括行数&#xff08;rows&#xff09;的估计值。然而&#xff0c;有时候我们会发现这个估计值与实际的行数并不一致。本文将探讨这个问题&#xff0c;并提供…

介绍下官网Redis编程模式

缘由 以前只是接触过redis&#xff0c;只有最近才比较深入研究了下&#xff0c;觉得有几个重要的概念可以积累出来&#xff0c;以利于帮助理解redis &#x1f603; 本文仅简述重点概念&#xff0c;和列举相关参考文档链接&#xff0c;但参见文档多来自redis官网&#xff0c;足…

微信小程序开发者工具] ? Enable IDE Service (y/N) ESC[27DESC[27C

在HBuilder运行微信小程序开发者工具报错 如何解决 打开微信小程序开发者工具打开设置--->安全设置--->服务器端口选择打开就可以啦

《C++ Primer》第9章 顺序容器(三)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 9.5 额外的string操作&#xff08;P320&#xff09; 9.5.1 构造string的其他方法 const char *cp "hello, world!"; char arr[] { h,\0,i,\0 }; string s1(cp); // s1 "hello, world!…

代码随想录训练营 | 一刷总结

代码随想录一刷总结 文章目录 代码随想录一刷总结数组数组理论基础二分法双指针法滑动窗口 链表链表理论基础虚拟头节点链表的基本操作反转链表两两交换链表中的节点删除倒数第N个节点链表相交环形链表 哈希表哈希表理论基础数组作为哈希表Set作为哈希表Map作为哈希表 字符串双…

C#中的var究竟是强类型还是弱类型?

前言 在C#中&#xff0c;var关键字是用来声明变量类型的&#xff0c;它是C# 3.0推出的新特征&#xff0c;它允许编译器根据初始化表达式推断变量类型&#xff0c;有点跟javascript类似&#xff0c;而javascript中的var是弱类型。它让C#变量声明更加简洁&#xff0c;但也导致了…

算法设计与分析复习--分支界限法

文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法&#xff08;二&#xff09; 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间&#xff1a; 子集树排列树 …

Promise.all如果其中之一失败,怎么能够拿到其他成功的结果

Promise.all 的基础介绍 作用&#xff1a;Promise.all()方法用于将多个 Promise 实例&#xff0c;包装成一个新的 Promise 实例。 参数&#xff1a;由多个Promise实例组成的数组 const p Promise.all([p1, p2, p3]);p的状态由p1、p2、p3决定&#xff0c;分成两种情况。 &a…