- 浏览: 138337 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
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 902上篇中主要使用配置文件来定义一些类实例之间的组织关系 ... -
关于java中对象属性值的校验的思考
2013-04-15 14:09 1557现在在java 开发中经常会遇到要交验某个obje ... -
JTextArea ScrollBar 自动滚动
2013-01-11 16:40 999前几天在JScrollPanel 中放了一个JEditorPa ... -
java 动态编译及执行实现Web式java开发
2012-11-29 17:05 923废话不说,让大家等了这么久,先看看截图 : 编译 ... -
MigLayout 使用
2012-11-07 17:03 973如果你还在用用Java 做桌面程序,如果你还在用java ... -
JXLayer 使用简单介绍
2012-11-01 17:25 1320JXLayer 是一个很好的Swing 控件装饰类库,其主要要 ... -
关于Jtextinpt 内容的限制
2012-09-28 15:00 812在JTextInput 限制输入内容,这个一般的通过按键输入进 ... -
构造中的多态
2012-08-25 23:19 857各位仁兄,前几日我在 ... -
模版模式(TemplatePattern)
2012-07-15 11:08 797模版模式分为2个部分 1.抽象模版 2.具体模版 ... -
JTable 使用简要说明
2012-07-02 16:30 887JTable 是swing 包中提供显示二维表的控件,一般被 ... -
java awt 布局
2012-07-01 17:50 1291汗颜啊,昨天到今天写一个awt界面,布局差点把人恶心死,现在总 ... -
门面模式(Facade Pattern)
2012-06-10 19:37 989门面模式(Facade Pattern):门面模式在我个人感觉 ... -
代理模式例子
2012-06-04 15:07 988代理模式简单点就和现实中一样,只是代理实质性的还是别人在做。比 ... -
策略模式应对旅行中出现的问题
2012-06-04 14:21 887策略模式是针对在进行过程中出现一些问题的应对模式。一般可以分为 ... -
java 工厂模式简单介绍及例子
2012-06-03 23:16 1066java中工厂模式在java ee中经常碰见,是一种常见的模式 ... -
java 动态代理及自定义标注使用例子
2012-06-03 00:14 1237java中动态代理,在实际应用中有着很大的作用,譬如在一些类似 ... -
flex3 socket+java
2012-02-06 12:10 1090首先解决的问题是flex的沙箱问题,由于flex 连接服务器存 ... -
java 自定义注解
2012-01-30 16:09 835写道 package com.my;import j ... -
图片裁剪,缩放 批处理
2012-01-07 15:25 1024package dwr.demo; import ... -
java System.Properties
2011-10-26 13:19 749使用Properties.getProperty方法的参数也可 ...
相关推荐
### Java Swing JTable 分页实现详解 #### 一、引言 在开发基于Java Swing的应用程序时,我们经常需要处理大量的数据展示问题。对于表格形式的数据展示,`JTable`是一个非常常用且强大的组件。然而,当数据量过大时...
swing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing ...
Swing JTable组件设置单元格合并,内置Test测试类,核心API GridBagTable tasktable = new GridBagTable(model); tasktable.mergeCells(startRow, endRow, 0, 0);
JTable实现下拉动态加载数据,滑动动态加载数据,纯原生态java。
Swing中的JTable组件是Java GUI开发中用于展示表格数据的重要工具,它是Swing库中的一个核心组件。JTable能够方便地创建和管理表格数据,同时也支持用户交互,如编辑单元格、排序、选择行等操作。下面我们将深入探讨...
java swing 导出Jtable里面的数据到excel,不用拷贝代码,直接粘贴代码
Swing JTable 常用属性详解 Swing JTable 是 Java 中一个常用的表格控件,用于显示和编辑表格数据。在实际开发中,经常需要对 JTable 进行各种设置和操作,这篇文章将详细介绍 JTable 的常用属性和方法。 一、创建...
Swing之JTable用法
用Java Swing Jtable做的日历
### Swing之JTable详解 #### 类层次结构图 在Swing框架中,`JTable`是构建GUI应用程序中表格的主要组件。它继承自`JComponent`类,这使得`JTable`能够支持丰富的图形用户界面功能。下面展示了`JTable`的类层次结构...
它是Swing中最复杂和强大的组件之一,具有许多高级功能和灵活的配置选项。下面将详细介绍JTable的用法和相关知识点。 1. JTable与TableModel JTable组件的核心是TableModel接口,它定义了表格的结构和数据。...
在这个类中,我们需要重写`getColumnClass`方法,确保指定列的数据类型为`JComboBox`,这样`JTable`就会知道应该使用`TableCellEditor`来编辑该列。 2. **实现TableCellEditor** 实现`TableCellEditor`接口,创建...
在Java的Swing库中,`JTable`是用于创建数据网格视图的重要组件,它允许用户以表格的形式查看和操作数据。而`JButton`则是一个常用的按钮控件,通常用于触发某些动作或事件。将`JButton`添加到`JTable`中可以为用户...
Java Swing 实现 JTable 检测单元格数据变更事件的方法示例 Java Swing 中的 JTable 是一个功能强大且灵活的表格组件,广泛应用于各种桌面应用程序中。然而,在实际开发中,我们经常需要检测单元格数据的变更事件...
类中使用JTable 实现了对JTable中行级的增删改 JFrame为自主布局,设置了背景图片以及窗口图标 有详细注释 例如: TableModel tableModel = jTable1.getModel(); DefaultTableModel dtm = (DefaultTableModel) ...
在"swing中JTable的简单使用"这个主题中,我们将深入探讨如何在Java Swing应用中有效地使用JTable。 首先,JTable是javax.swing.JTable类的实例,它是JFrame或JPanel等容器中的一个组件。JTable通常与TableModel...
java swing表格分页控件封装,有利于在开发中节约时间
总之,`TableCheckboxManager`作为一个工具类,极大地简化了在Swing的JTable组件中使用复选框的工作。它不仅处理了复选框的创建、渲染和编辑,还提供了事件监听和批量操作的便利功能,使得开发者能更专注于业务逻辑...
我们可以使用 `JTable` 组件来显示表格数据,并使用 `JScrollPane` 组件来提供滚动条功能。为了实现分页,我们需要使用 `DefaultTableModel` 来管理表格数据,并使用按钮组件来控制分页操作。 PageTable 类 在给定...