- 浏览: 132944 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
yaoweinan:
没有.....
Itext 5.4.0 生成PDF中文不报错,Adobe 不显示 -
马文涛:
我也发现这个问题了,你找到解决办法了吗?
Itext 5.4.0 生成PDF中文不报错,Adobe 不显示 -
coding1688:
博主辛苦了,也可以参考一下这篇文章:四步轻松搞定瀑布流布局ht ...
瀑布流布局个人实现 -
yaoweinan:
嘿嘿,那个只是最笨的办法,实际上是不行的,现在一般的都有sw ...
文件上传(无刷新,带进度条,带网速)下载完整 -
javazzu:
我为啥不行呢
文件上传(无刷新,带进度条,带网速)下载完整
JTable 是我们一般展示数据的一个很好的Grid组建,个人认为在使用swing 组建时对其model的定义很重要,今天鄙人做了小小研究,定义了自己的TableModel,甚是高兴,于是分享出来与大家共同进步。
首先定义我们要展示的数据模型:
MyData.java
package table; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import table.MyTableDataModel.MyTableColumn; /** * My dataModel * @author Lyon Yao * */ public class MyData { private String name; private String sex; private String cellphone; private String address; private Boolean isSelected; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getCellphone() { return cellphone; } public void setCellphone(String cellphone) { this.cellphone = cellphone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Object isSelected() { return this.isSelected; } public void setSelected(Boolean value){ this.isSelected=value; } public HashMap<MyTableColumn, String> validate() { HashMap<MyTableColumn, String> result=new HashMap<MyTableDataModel.MyTableColumn, String>(0); if(this.name==null||this.name.isEmpty()){ result.put(MyTableColumn.NAME, "Please Input Name"); } if(!isNumeric(this.cellphone)){ result.put(MyTableColumn.CELLPHONE, "Please Input Correct CellPhone"); } return result; } public boolean isNumeric(String str) { Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(str); if (!isNum.matches()) { return false; } return true; } }
然后去定义我的TableModel,比较扯,我将renderer和editor也在model里面做了关联定义,只在使用时候调用的。
MyTableDataModel.java
package table; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.HashMap; import java.util.List; import javax.imageio.ImageIO; import javax.swing.DefaultCellEditor; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; /** * this class is used to difine the table's model,in this class,we defined * column's cell editor and renderer * @author Lyon Yao * */ public class MyTableDataModel extends AbstractTableModel { /** * */ private static final long serialVersionUID = -7312994273683436365L; enum MyTableColumn implements ValueOperate{ IS_SELECTED(""){ @Override public Object getValue(MyData rowData) { return rowData.isSelected(); } @Override public void setValue(MyData rowData, Object obj) { rowData.setSelected(obj==null?false:Boolean.valueOf(obj.toString())); } @Override public TableCellEditor getCellEditor() { return new DefaultCellEditor(new JCheckBox()); } @Override public TableCellRenderer getCellRenderer() { return new TableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JCheckBox checkBox=new JCheckBox(); checkBox.setSelected((Boolean)value); return checkBox; } }; } @Override public int getMinWidth() { return 25; } @Override public int getMaxWidth() { return 25; } },NAME("Name"){ @Override public Object getValue(MyData rowData) { return rowData.getName(); } @Override public void setValue(MyData rowData,Object obj) { if(obj==null)return; rowData.setName(obj.toString()); } @Override public int getMinWidth() { return 100; } @Override public int getMaxWidth() { return 200; } },SEX("Sex"){ @Override public Object getValue(MyData rowData) { return rowData.getSex(); } @Override public void setValue(MyData rowData,Object obj) { rowData.setSex(obj==null?null:obj.toString()); } @Override public TableCellEditor getCellEditor() { JComboBox box=new JComboBox(); box.addItem("Male"); box.addItem("Famale"); return new DefaultCellEditor(box); } @Override public TableCellRenderer getCellRenderer() { return new TableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JComboBox box=new JComboBox(); box.addItem(value); box.setSelectedIndex(0); return box; } }; } @Override public int getMinWidth() { return 70; } @Override public int getMaxWidth() { return 120; } },CELLPHONE("Cellphone"){ @Override public Object getValue(MyData rowData) { return rowData.getCellphone(); } @Override public void setValue(MyData rowData,Object obj) { rowData.setCellphone(obj==null?null:obj.toString()); } @Override public int getMinWidth() { return 150; } @Override public int getMaxWidth() { return 150; } },ADRESS("Address"){ @Override public Object getValue(MyData rowData) { return rowData.getAddress(); } @Override public void setValue(MyData rowData,Object obj) { rowData.setAddress(obj==null?null:obj.toString()); } @Override public int getMinWidth() { return 200; } @Override public int getMaxWidth() { return 1000; } }; private final String name; private TableCellEditor editor; private TableCellRenderer renderer; private MyTableColumn(String name) { this.name = name; } @Override public void setCellEditor(TableCellEditor editor) { this.editor=editor; } @Override public void setCellRenderer(TableCellRenderer renderer) { this.renderer=renderer; } @Override public String toString() { return this.name; } @Override public TableCellEditor getCellEditor() { return this.editor; } @Override public TableCellRenderer getCellRenderer() { return this.renderer; } } interface ValueOperate{ Object getValue(MyData rowData); void setValue(MyData rowData,Object obj); TableCellEditor getCellEditor(); TableCellRenderer getCellRenderer(); void setCellEditor(TableCellEditor editor); void setCellRenderer(TableCellRenderer renderer); int getMinWidth(); int getMaxWidth(); } private final List<MyData> data; private static BufferedImage dash; static{ try { dash=ImageIO.read(MyTableDataModel.class.getClassLoader().getResources("table\\dash.png").nextElement()); } catch (IOException e) { e.printStackTrace(); } ; } public MyTableDataModel(List<MyData> data) { super(); this.data = data; setUpColumEidtors(); setUpColumnRenders(); } private void setUpColumEidtors(){ final DefaultCellEditor editor=new DefaultCellEditor(new JTextField()); for(MyTableColumn col:MyTableColumn.values()){ col.setCellEditor(editor); } } public void addItem(MyData data){ this.data.add(data); fireTableDataChanged(); } public void delete(MyData data){ if(data!=null){ this.data.remove(data); fireTableDataChanged(); } } public void delete(int index){ if(index>-1&&index<this.data.size()){ this.data.remove(index); fireTableDataChanged(); } } private void setUpColumnRenders(){ final DefaultTableCellRenderer renderer=new DefaultTableCellRenderer(){ /** * */ private static final long serialVersionUID = 2330186726723746657L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component component= super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); HashMap<MyTableColumn, String> errorData = isErrorData(row,column); if(!errorData.isEmpty()){ final JPanel panel=new JPanel(new BorderLayout()){ /** * */ private static final long serialVersionUID = -6170683167857459445L; @Override public void paint(Graphics g) { super.paint(g); final int cc=(int) Math.round((getWidth()*1.0/dash.getWidth())); for(int i=0;i<cc;i++){ g.drawImage(dash, i*dash.getWidth(), getHeight()-dash.getHeight(),null); } } }; panel.add(component); panel.setToolTipText(errorData.get(getColumnByIndex(column))); component=panel; } return component; } }; for(MyTableColumn col:MyTableColumn.values()){ col.setCellRenderer(renderer); } } private MyTableColumn getColumnByIndex(int column){ return MyTableColumn.values()[column]; } private HashMap<MyTableColumn,String> isErrorData(int row,int column){ MyData rowData=data.get(row); HashMap<MyTableColumn, String> result=new HashMap<MyTableDataModel.MyTableColumn, String>(0); HashMap<MyTableColumn, String> validte= rowData.validate(); for(MyTableColumn col:validte.keySet()){ if(col.ordinal()==column){ result.put(col, validte.get(col)); } } return result; } @Override public int getRowCount() { return this.data.size(); } @Override public int getColumnCount() { return MyTableColumn.values().length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { MyData row=data.get(rowIndex); for(MyTableColumn column:MyTableColumn.values()){ if(column.ordinal()==columnIndex) return column.getValue(row); } return null; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { MyData row=data.get(rowIndex); for(MyTableColumn column:MyTableColumn.values()){ if(column.ordinal()==columnIndex) column.setValue(row,aValue); } } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } }
好了 核心的东西已经出来了,下面写个测试类玩玩:)
TableExample.java
package table; import java.awt.HeadlessException; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.WindowConstants; public class TableExample extends JFrame { /** * */ private static final long serialVersionUID = -5180906807674700787L; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new TableExample(); } private TableExample() throws HeadlessException { super(); this.setBounds(200, 200, 1024, 768); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); this.creatTable(); this.setVisible(true); } private void creatTable() { final List<MyData> data=new ArrayList<MyData>(0); MyData myData = new MyData(); myData.setName("xxxddd"); myData.setAddress("XXOOXXOO"); myData.setCellphone("11392901"); myData.setSex("Famale"); myData.setSelected(true); data.add(myData); myData = new MyData(); myData.setName("xxxddd"); myData.setAddress("XXOOXXOO"); myData.setCellphone("11392901"); myData.setSex("Famale"); myData.setSelected(true); data.add(myData); myData = new MyData(); myData.setName("xxxddd"); myData.setAddress("XXOOXXOO"); myData.setCellphone("11392901"); myData.setSex("Famale"); myData.setSelected(true); data.add(myData); JTable table=new JTable(new MyTableDataModel(data)); table.setRowHeight(20); for( MyTableDataModel.MyTableColumn column:MyTableDataModel.MyTableColumn.values()) { table.getColumnModel().getColumn(column.ordinal()).setHeaderValue(column); table.getColumnModel().getColumn(column.ordinal()).setCellEditor(column.getCellEditor()); table.getColumnModel().getColumn(column.ordinal()).setCellRenderer(column.getCellRenderer()); table.getColumnModel().getColumn(column.ordinal()).setMaxWidth(column.getMaxWidth()); table.getColumnModel().getColumn(column.ordinal()).setMinWidth(column.getMinWidth()); } JScrollPane panle=new JScrollPane(table); this.add(panle); } }
大功告成,试运行如图:
发表评论
-
写自己的框架,让别人笑掉大牙吧(IOC2)
2013-04-22 14:23 861上篇中主要使用配置文件来定义一些类实例之间的组织关系 ... -
关于java中对象属性值的校验的思考
2013-04-15 14:09 1510现在在java 开发中经常会遇到要交验某个obje ... -
JTextArea ScrollBar 自动滚动
2013-01-11 16:40 937前几天在JScrollPanel 中放了一个JEditorPa ... -
java 动态编译及执行实现Web式java开发
2012-11-29 17:05 887废话不说,让大家等了这么久,先看看截图 : 编译 ... -
MigLayout 使用
2012-11-07 17:03 933如果你还在用用Java 做桌面程序,如果你还在用java ... -
JXLayer 使用简单介绍
2012-11-01 17:25 1274JXLayer 是一个很好的Swing 控件装饰类库,其主要要 ... -
关于Jtextinpt 内容的限制
2012-09-28 15:00 756在JTextInput 限制输入内容,这个一般的通过按键输入进 ... -
构造中的多态
2012-08-25 23:19 816各位仁兄,前几日我在 ... -
模版模式(TemplatePattern)
2012-07-15 11:08 752模版模式分为2个部分 1.抽象模版 2.具体模版 ... -
JTable 使用简要说明
2012-07-02 16:30 844JTable 是swing 包中提供显示二维表的控件,一般被 ... -
java awt 布局
2012-07-01 17:50 1252汗颜啊,昨天到今天写一个awt界面,布局差点把人恶心死,现在总 ... -
门面模式(Facade Pattern)
2012-06-10 19:37 924门面模式(Facade Pattern):门面模式在我个人感觉 ... -
代理模式例子
2012-06-04 15:07 939代理模式简单点就和现实中一样,只是代理实质性的还是别人在做。比 ... -
策略模式应对旅行中出现的问题
2012-06-04 14:21 811策略模式是针对在进行过程中出现一些问题的应对模式。一般可以分为 ... -
java 工厂模式简单介绍及例子
2012-06-03 23:16 1011java中工厂模式在java ee中经常碰见,是一种常见的模式 ... -
java 动态代理及自定义标注使用例子
2012-06-03 00:14 1159java中动态代理,在实际应用中有着很大的作用,譬如在一些类似 ... -
flex3 socket+java
2012-02-06 12:10 1028首先解决的问题是flex的沙箱问题,由于flex 连接服务器存 ... -
java 自定义注解
2012-01-30 16:09 794写道 package com.my;import j ... -
图片裁剪,缩放 批处理
2012-01-07 15:25 986package dwr.demo; import ... -
java System.Properties
2011-10-26 13:19 711使用Properties.getProperty方法的参数也可 ...
相关推荐
Java Swing JTable分页!JAVA源码!
swing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing ...
Swing JTable 常用属性Swing JTable 常用属性Swing JTable 常用属性Swing JTable 常用属性Swing JTable 常用属性
JTable实现下拉动态加载数据,滑动动态加载数据,纯原生态java。
Swing之JTable的详细介绍,讲述jtable的操作和excle表之间的转换
java swing 导出Jtable里面的数据到excel,不用拷贝代码,直接粘贴代码
Swing之JTable用法
用Java Swing Jtable做的日历
Swing之JTable详解 类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container --javax.swing.JComponent --javax.swing.JTabel
文件主要内容是Java Swing中JTable的常用功能的应用
Swing JTable组件设置单元格合并,内置Test测试类,核心API GridBagTable tasktable = new GridBagTable(model); tasktable.mergeCells(startRow, endRow, 0, 0);
java swing表格分页控件封装,有利于在开发中节约时间
类中使用JTable 实现了对JTable中行级的增删改 JFrame为自主布局,设置了背景图片以及窗口图标 有详细注释 例如: TableModel tableModel = jTable1.getModel(); DefaultTableModel dtm = (DefaultTableModel) ...
中级SWING-J中级中级SWING-JTable属性SWING-JTable属性Table属性
基於Swing JTable的DataGrid 含有按鈕 進度條
在java swing的开发中,需要往表格添加自定义对象,往往需要转换。此类定义了抽象类,运用了范型技术。只需继承时传入对象类型,既可以操作对象表格Model。 作者(HuaSheng) 如有不足,欢迎给我email:sheng24@vip....
swing 中JTABLE中添加控件的例子 可以引申出添加很多控件
主要介绍了Java Swing实现JTable检测单元格数据变更事件的方法,结合完整实例形式分析了Swing实现JTable检测单元格数据变更事件过程中出现的问题与相关解决方法,需要的朋友可以参考下