`
yaoweinan
  • 浏览: 137547 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Swing JtableModel 使用之旅

 
阅读更多

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);
		
	}
	

}

 大功告成,试运行如图:



 

 

  • 大小: 47.2 KB
分享到:
评论

相关推荐

    Java Swing JTable分页

    ### Java Swing JTable 分页实现详解 #### 一、引言 在开发基于Java Swing的应用程序时,我们经常需要处理大量的数据展示问题。对于表格形式的数据展示,`JTable`是一个非常常用且强大的组件。然而,当数据量过大时...

    swing Jtable使用checkbox

    swing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing ...

    Swing JTable组件设置单元格合并

    Swing JTable组件设置单元格合并,内置Test测试类,核心API GridBagTable tasktable = new GridBagTable(model); tasktable.mergeCells(startRow, endRow, 0, 0);

    java Swing Jtable 下拉动态加载数据

    JTable实现下拉动态加载数据,滑动动态加载数据,纯原生态java。

    Swing之JTable的详细介绍

    Swing中的JTable组件是Java GUI开发中用于展示表格数据的重要工具,它是Swing库中的一个核心组件。JTable能够方便地创建和管理表格数据,同时也支持用户交互,如编辑单元格、排序、选择行等操作。下面我们将深入探讨...

    java swing 导出Jtable里面的数据到excel

    java swing 导出Jtable里面的数据到excel,不用拷贝代码,直接粘贴代码

    Swing JTable 常用属性

    Swing JTable 常用属性详解 Swing JTable 是 Java 中一个常用的表格控件,用于显示和编辑表格数据。在实际开发中,经常需要对 JTable 进行各种设置和操作,这篇文章将详细介绍 JTable 的常用属性和方法。 一、创建...

    Swing之JTable用法

    Swing之JTable用法

    用Java Swing Jtable做的日历

    用Java Swing Jtable做的日历

    Swing之JTable详解

    ### Swing之JTable详解 #### 类层次结构图 在Swing框架中,`JTable`是构建GUI应用程序中表格的主要组件。它继承自`JComponent`类,这使得`JTable`能够支持丰富的图形用户界面功能。下面展示了`JTable`的类层次结构...

    Java Swing高级空件JTable的用法

    它是Swing中最复杂和强大的组件之一,具有许多高级功能和灵活的配置选项。下面将详细介绍JTable的用法和相关知识点。 1. JTable与TableModel JTable组件的核心是TableModel接口,它定义了表格的结构和数据。...

    Swing之JTable+JComboBox的详细介绍[zone yan]

    在这个类中,我们需要重写`getColumnClass`方法,确保指定列的数据类型为`JComboBox`,这样`JTable`就会知道应该使用`TableCellEditor`来编辑该列。 2. **实现TableCellEditor** 实现`TableCellEditor`接口,创建...

    Java Swing实现JTable检测单元格数据变更事件的方法示例

    Java Swing 实现 JTable 检测单元格数据变更事件的方法示例 Java Swing 中的 JTable 是一个功能强大且灵活的表格组件,广泛应用于各种桌面应用程序中。然而,在实际开发中,我们经常需要检测单元格数据的变更事件...

    swing中JTable的使用

    类中使用JTable 实现了对JTable中行级的增删改 JFrame为自主布局,设置了背景图片以及窗口图标 有详细注释 例如: TableModel tableModel = jTable1.getModel(); DefaultTableModel dtm = (DefaultTableModel) ...

    swing中JTable的简单使用

    在"swing中JTable的简单使用"这个主题中,我们将深入探讨如何在Java Swing应用中有效地使用JTable。 首先,JTable是javax.swing.JTable类的实例,它是JFrame或JPanel等容器中的一个组件。JTable通常与TableModel...

    swing表格分页控件封装

    java swing表格分页控件封装,有利于在开发中节约时间

    共享一个Swing JTable组件的CheckBox管理类

    总之,`TableCheckboxManager`作为一个工具类,极大地简化了在Swing的JTable组件中使用复选框的工作。它不仅处理了复选框的创建、渲染和编辑,还提供了事件监听和批量操作的便利功能,使得开发者能更专注于业务逻辑...

    java_swing表格分页

    我们可以使用 `JTable` 组件来显示表格数据,并使用 `JScrollPane` 组件来提供滚动条功能。为了实现分页,我们需要使用 `DefaultTableModel` 来管理表格数据,并使用按钮组件来控制分页操作。 PageTable 类 在给定...

Global site tag (gtag.js) - Google Analytics