这是我参与更文挑战的第5天,活动详情查看: 更文挑战java
本文正在参加「Java主题月 - Java 开发实战」,详情查看 活动连接web
最近利用空闲时间本身琢磨了一下java swing 编程,其实在从事javaweb以前我一直向往的就是java swing 开发,不知道为何可能当时以为Windows上的exe程序非常神奇,关于windows上制做exe我以前也有介绍编程
exe打包教程一windows
exe打包教程二数组
java swing开发都是本身琢磨的,有的地方写的不规范,不过大多都是网上借鉴的,应该不算离谱的。markdown
今天看了看本身的java swing的程序,感受写的还不错,可是发现如今遇到一个瓶颈问题,就是jtable的使用,因为一开始概念不理解如今jtable得从新写,以前我吧数据放在jtable上了,可是真正开发的java swing数据都是放在TableModel上的。下面就Jtable的使用,好好整理了一番,途中参考的文章我都会放在下面列出,读者能够本身参考**mvc
JTable=TableHeader+TableColumnless
顾名思义咱们知道表格是由表头和表列组成的,这两个都是单独的控件。可是JTable中若是想让表头显示仅仅将JTable加入Jpanel或者Jframe中是不行的,我这里提供两种方式实现编辑器
一、分别将TableHeader和TableColumn加入控件中单独的显示,这种状况不常见ide
二、先将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);
复制代码
setPreferredScrollableViewportSize
无关紧要的,无所谓,可是setFillsViewportHeight
是设置表格在纵向上的铺展状况,什么意思呢,若是这里设置为true则表格就会在纵向上铺满jframe,若是是false,表格则会按照本身的实际占地面积显示,不会多占的。众多周知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);
复制代码
//表格的列,须要用户本身设定好
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;
}
复制代码
在上面咱们继承了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操做。/**
* 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;
}
复制代码
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");
}
复制代码
return getValueAt(0, c).getClass();
复制代码
setCellEditor和setCellRenderer
复制代码
你们能够观察源码,在JTable的编辑器中AbstractCellEditor是基础的抽象类,他继承了CellEditor,怎么样熟悉吗,这个不就是和AbstractTableModel 是同样的吗。可是这个类不能反回控件须要和TableCellEditor结合使用,或者咱们只是用另一个基础类DefaultCellEditor,
DefaultCellEditor和AbstractTableModel 有设么区别呢,他们都是同样实现了CellEditor接口,可是前者构造中只能传入控件,也就是说每日次实力只能经过不一样构造函数构建不一样的控件,可是后者是抽象类,继承的类能够自定义构造函数,这就方便咱们够赞多个不一样的控件了,因此这两个你们看状况使用。最后都是经过getTableCellEditorComponent
这个函数将控件返回出去。
设置完了编辑器,咱们最终要是只渲染器,就是JTable最终如何显示的问题。和上面的那个同样。继承TableCellRenderer类,经过getTableCellRendererComponent方法返回渲染成设么控件,渲染的控件咱们能够进行二次封装。
调用以下 两个参数就是经过上面两个类构造的类
column.setCellEditor(editor);
column.setCellRenderer(renderer);
复制代码