最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于windows上制作exe我之前也有介绍

exe打包教程一

exe打包教程二


java swing开发都是自己琢磨的,有的地方写的不规范,不过大多都是网上借鉴的,应该不算离谱的。今天看了看自己的java swing的程序,感觉写的还不错,但是发现现在遇到一个瓶颈问题,就是jtable的使用,由于一开始概念不理解现在jtable得重新写,之前我吧数据放在jtable上了,但是真正开发的java swing数据都是放在TableModel上的。下面就Jtable的使用,好好整理了一番,途中参考的文章我都会放在下面列出,读者可以自己参考


JTable结构梳理

  • JTable=TableHeader+TableColumn

  • 顾名思义我们知道表格是由表头和表列组成的,这两个都是单独的控件。但是JTable中如果想让表头显示仅仅将JTable加入Jpanel或者Jframe中是不行的,我这里提供两种方式实现

  • 1、分别将TableHeader和TableColumn加入控件中单独的显示,这种情况不常见

  • 2、先将JTable加入jscrollpane(滚动条)中,然后在将滚动条加入到对应的控件中(Jpanel或者是Jframe).java swing 开发中加入滚动条是很常见的操作,所以这种方式的加入表格还是很推荐的。
table = new JTable(data, columnNames);
table.setBackground(Color.gray);
table.setPreferredScrollableViewportSize(new Dimension(800, 100));
table.setFillsViewportHeight(false);
pane = new JScrollPane(table);
this.add(pane);
  • 上面的代码就是简单的实现将表格以显示表头的方式加入到jframe中显示。其中我们能够看到多了几个设置,setPreferredScrollableViewportSize可有可无的,无所谓,但是setFillsViewportHeight是设置表格在纵向上的铺展情况,什么意思呢,如果这里设置为true则表格就会在纵向上铺满jframe,如果是false,表格则会按照自己的实际占地面积显示,不会多占的。

JTable数据显示

  • java swing中jtable是mvc形式的,所以jtable仅仅是数据的显示,而真正和数据绑定的却是TableModel这个接口,我们先看看这个接口的内部有哪些方法,这样我们心里才有个底。

  • 众多周知jtable中常用的两种构造函数一个是数组另一个是vector,这两种构造函数中都是采用了匿名内部类实现tablemodel,前者用的是AbstractTableModel,后者是DefaultTableModel。而DefaultTableModel有事继承了AbstractTableModel,所以我们平时如果自定义model的话,都会去继承AbstractTableModel的。我们在去源码里可以看见,我们会发现AbstractTableModel有事继承TableModel这个接口的。所以我们的所有方法都是源于他。

  • 我们观察AbstractTableModel源码中注释发现,我们只需要继承AbstractTableModel类后只需要实现三个必须的方法,其他的方法根据需要实现

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

  • 这三个方法的作用就是通过model高数jtable我需要一个几行几列的表格,至于每个单元格显示的内容就是通过getValueAt这个方法实现的,到这里我们就实现了,jtable的model自定义显示。
//表格的列,需要用户自己设定好
private int column;
//待加载的数据 数据每行的列数和上面要统一好
private List<Object> list; public MyTableModel(List<Object> list,int column){
this.column=column;
this.list=list;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return list.size();
} @Override
public int getColumnCount() {
// TODO Auto-generated method stub
return this.column;
} @Override
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return list.get(rowIndex).toString()+"_"+rowIndex+"_"+columnIndex;
}
  • 上面的代码就是我的model类,里面有个穿list的构造函数,然后我们看看我们的三个方法就起到了作用了。然后在getValueAt获取指定行数的list的指定内容就可以填充到表格上了。

jtable数据的CURD

  • 在上面我们继承了AbstractTableModel,这里面有对数据的CURD操作

if("增加".equals(command)){
List<Object> data = getData();
data.add("test5");
data.add("test6");
datamModel.setList(data);
// datamModel.fireTableStructureChanged();
datamModel.fireTableRowsInserted(5,6);
}else if("删除".equals(command)){
List<Object> data = getData();
data.remove(2);
datamModel.setList(data);
datamModel.fireTableRowsDeleted(1, 1);
}else if("更新".equals(command)){
List<Object> data = getData();
data.set(0, "test0_1");
datamModel.setList(data);
datamModel.fireTableRowsUpdated(0, 5);
}
  • 里面都会带有参数比如datamModel.fireTableRowsUpdated(0, 5);的意思是通州JTable显示模块去刷新从1-6行的所有数据,所以说比如你更新了第一行的数据,而你用的两个参数是1,4.那么恭喜你,你的更新JTable无法实现,因为他只更新从第二行开始到第五行的数据。其他的方法参数和他一样。通过上面就可以轻松实现JTable的CURD操作。

JTable控件显示法

  • 相信有的朋友遇到过,表格中需要显示CheckBox、button等控件的,但是我们发现我们定义的控件在表格上显示成了控件对应的类的字符串了,这又是为什么呢。下面请随我一起看看源码吧:
/**
* Returns <code>Object.class</code> regardless of <code>columnIndex</code>.
*
* @param columnIndex the column being queried
* @return the Object.class
*/
public Class<?> getColumnClass(int columnIndex) {
return Object.class;
}
  • 源码中AbstractTableModel的getColumnClass的方法是JTable决定显示类型的主要依据,源码中返回的默认是object.class,这就意味着我们在jtable是true或false或其他类,在这里都会返回object.class,那么jtable就会采用默认的渲染方式去渲染表格,默认的就是所有都是字符串形式展示,这个设置在JTable中的源码中
protected void createDefaultRenderers() {
defaultRenderersByColumnClass = new UIDefaults(8, 0.75f); // Objects
setLazyRenderer(Object.class, "javax.swing.table.DefaultTableCellRenderer$UIResource"); // Numbers
setLazyRenderer(Number.class, "javax.swing.JTable$NumberRenderer"); // Doubles and Floats
setLazyRenderer(Float.class, "javax.swing.JTable$DoubleRenderer");
setLazyRenderer(Double.class, "javax.swing.JTable$DoubleRenderer"); // Dates
setLazyRenderer(Date.class, "javax.swing.JTable$DateRenderer"); // Icons and ImageIcons
setLazyRenderer(Icon.class, "javax.swing.JTable$IconRenderer");
setLazyRenderer(ImageIcon.class, "javax.swing.JTable$IconRenderer"); // Booleans
setLazyRenderer(Boolean.class, "javax.swing.JTable$BooleanRenderer");
}
  • 源码中就有渲染器专门处理bool类型的,那么我们只需要在getColumnClass进行处理就行了,在我们的bool的单元格返回bool类JTable就会采用bool类型的渲染器了。
return getValueAt(0, c).getClass();
  • 这样我们就可以显示一些其他的控件了,还有一些比如每行都需要一行按钮来实现修改改行的功能,这些按钮正常我们不需要再数据中添加(避免数据过于庞大),如果不在数据中添加那么我们的getClass方法就起不到作用,这个用到了下面的知识来解决

JTable渲染和编辑

  • 这种呢其实就是上面的getClass底层的实现方式,JTable中源码我们上面可以看出JTable通过返回的不同的类来调用不同的渲染器,现在我们不通过返回类的方式来渲染,而是自己定义一个渲染器,然后通过JTable提供的方法设定用该渲染器渲染该单元格!
setCellEditor和setCellRenderer
  • 大家可以观察源码,在JTable的编辑器中AbstractCellEditor是基础的抽象类,他继承了CellEditor,怎么样熟悉吗,这个不就是和AbstractTableModel 是一样的吗。但是这个类不能反回控件需要和TableCellEditor结合使用,或者我们只是用另外一个基础类DefaultCellEditor,

  • DefaultCellEditor和AbstractTableModel 有设么区别呢,他们都是一样实现了CellEditor接口,但是前者构造中只能传入控件,也就是说每日次实力只能通过不同构造函数构建不同的控件,但是后者是抽象类,继承的类可以自定义构造函数,这就方便我们够赞多个不同的控件了,所以这两个大家看情况使用。最后都是通过getTableCellEditorComponent这个函数将控件返回出去。

  • 设置完了编辑器,我们最终要是只渲染器,就是JTable最终如何显示的问题。和上面的那个一样。继承TableCellRenderer类,通过getTableCellRendererComponent方法返回渲染成设么控件,渲染的控件我们可以进行二次封装。

  • 调用如下 两个参数就是通过上面两个类构造的类

column.setCellEditor(editor);

column.setCellRenderer(renderer);





源码下载

java swing 开发 -JTable的更多相关文章

  1. ae(ArcEngine) java swing开发入门系列(1):开发环境和代码部署

    前言:做ae开发大部分人都是用C#版,很少用到java版,本系列文章主要介绍java版ae开发的入门,对于ae接口的高级应用,可以看C#版相关文章 开发环境软件: Intellij IDEA 2018 ...

  2. JAVA Swing开发单机版项目

    一.序 最近公司做的项目里出现了一个新的需求,项目大部分是为金融业定制开发的数据集成平台,包括数据的采集,处理,使用. 数据的采集方式不固定,有机构化数据,有非结构话数据,还有附件等其它文件形式. 对 ...

  3. Java Swing 之JTable及其简单的用法

    我们都知道JTable需要使用一个Model配合才能更好地发挥其作用.而使用Model有好多种方法,但是难易程度却大大不同,比如说我们使用AbstractTableModel接口要实现里面的好多方法, ...

  4. java swing 中JTable实现指定单元格为下拉框

    利用自定义的CellEditor实现第四列第二行为下拉框,本列其余行为文本框 利用默认的DefaultCellEditor设置第五列整列为下拉框   package mypackage; import ...

  5. ae(ArcEngine) java swing开发入门系列(2):ae的类型转换和Proxy类说明

    做过C#版ae的都知道,操作同一个“对象”,用他的不同功能要转换到相应的接口,但java版有时不能直接做类型转换 例如下图在C#是可以的 但在java不行,这样转会报错,看IFeatureClass的 ...

  6. Java多线程开发系列之番外篇:事件派发线程---EventDispatchThread

    事件派发线程是java Swing开发中重要的知识点,在安卓app开发中,也是非常重要的一点.今天我们在多线程开发中,穿插进来这个线程.分别从线程的来由.原理和使用方法三个方面来学习事件派发线程. 一 ...

  7. Java 集成开发环境的介绍及下载

    集成开发环境(integrated development environment,JDE) 之前成功运行了Java小程序是经历了先在笔记本中编写源代码,然后通过命令行运行打开javac编译源文件, ...

  8. TTMS 一个基于Java Swing的Socket通信的剧院票务管理系统

    TTMS (Theater Ticket Management System) 点我进入github TTMS全称剧院票务管理系统,分为客户端和服务器端.服务器端可以接收客户端连接请求,客户端相当于我 ...

  9. Java Swing 图形界面开发(目录)

    Java Swing 图形界面开发(目录) 2017年05月30日 23:50:42 阅读数:5228 本文链接: http://blog.csdn.net/xietansheng/article/d ...

随机推荐

  1. 微信小程序支付以及微信退款开发

    最近公司项目急着测试,需要开发微信小程序+微信支付+微信退款,本着这几天的一些研究,决定记录一下开发的过程. 本着知识分享的原则,希望对大家有所帮助. 本篇针对的是微信小程序的支付开发,如果有对微信公 ...

  2. MySql中的SHOW INDEX 查出的结果列代表的意义

    MySQL SHOW INDEX语法的实际操作用法以及其实际查看索引状态(语法)的具体内容的描述,如果你对这一技术,心存好奇的话,以下的文章将会揭开它的神秘面纱. INDEX FROM tbl_nam ...

  3. Java集合对象比对

    1. 场景描述 通过java代码从外围接口中获取数据并落地,已经存在的不落地,不存在的落地,因有部分字段变化是正常的,只需比对3个字段相同即为相同. 2. 解决方案 设置定时任务(三个标签完成spri ...

  4. Spring Boot日志使用

    前言: 这是我第一次仔细研究Spring Boot相关的知识,就拿日志下手了,欢迎大家指点 Spring Boot日志关系 这个是Spring Boot的启动器,我们点击spring-boot-sta ...

  5. SSAS 多维/表格设计模型--事实表与维表的关联

    表格设计模型中,同多维设计模型相似, 维表和事实表相互独立,通过关系数据库中的外键来联系,互相关联构成一个统一的架构. DB中外键是需要唯一性约束的,即A表某列建立主键或者唯一键后,B表才可以引用为外 ...

  6. [转载]nginx负载均衡+keepalived三主(多主)配置

    nginx负载均衡+keepalived三主(多主)配置 1.实验环境,实现目标三台主机分别配置nginx负载均衡对后端多台主机做转发,同时配置keepalived实现HA,保证任意主机出现故障时其他 ...

  7. 使用flink Table &Sql api来构建批量和流式应用(3)Flink Sql 使用

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  8. Golang 高效实践之并发实践context篇

    前言 在上篇Golang高效实践之并发实践channel篇中我给大家介绍了Golang并发模型,详细的介绍了channel的用法,和用select管理channel.比如说我们可以用channel来控 ...

  9. python基础知识四 小数据池,深浅拷贝,集合+菜中菜

    四.小数据池,深浅拷贝,集合+菜中菜 1小数据池 --缓存机制(驻留机制) ​ '==' 判断两边内容是否相等 ​ 'is' 基于内存地址进行判断是否相同 a = 10 b = 10 print(a ...

  10. isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)

    6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...