现在的位置: 首页 > 综合 > 正文

自定义jtable,实现排序,windows式多选习惯,斑马线,ToolTip

2013年09月15日 ⁄ 综合 ⁄ 共 5083字 ⁄ 字号 评论关闭
package com.browser;



import java.awt.Component;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.Point;

import java.awt.dnd.DnDConstants;

import java.awt.event.MouseEvent;



import javax.swing.JTable;

import javax.swing.ListSelectionModel;

import javax.swing.RowSorter;

import javax.swing.event.ListSelectionEvent;

import javax.swing.event.MouseInputListener;

import javax.swing.plaf.basic.BasicTableUI;

import javax.swing.table.DefaultTableCellRenderer;

import javax.swing.table.TableRowSorter;

/**

 * 自定义jtable,实现排序,windows式多选习惯,斑马线,ToolTip

 * @author dl

 */

public class JMyTable extends JTable {

	public int m_nRow = -1; /**当前列号*/

    public int[] m_nRows = null; /**当前选中的多个序号*/

    public JMyTableModel model;

    public RowSorter sorter;

    

	public JMyTable(JMyTableModel model) {

		super(model);

		setUI(new MyTableUI());

		this.model = model;	

		sorter = new TableRowSorter(model);

		setRowSorter(sorter);

		setColumnSelectionAllowed(false);

	    setRowSelectionAllowed(true);

	    setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);

		setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

		setDefaultRenderer(Object.class, new MyRender());

	}

	

	class MyRender extends DefaultTableCellRenderer

	{

		public Component getTableCellRendererComponent(JTable table, Object value, 

						boolean isSelected, boolean hasFocus, int row, int column) {

			super.getTableCellRendererComponent( table,  value, 

					 isSelected,  hasFocus,  row,  column);			

			//斑马线

			if ((row % 2) != 0) {

				setBackground(new java.awt.Color(236,233,216));

			} else {

				setBackground(java.awt.Color.white);

			}

			//选中反蓝

			if (isSelected) {

				setBackground(java.awt.Color.BLUE);

			}

			//字体设置

			Font font = new Font("宋体", Font.BOLD, 12);

			setFont(font);

			return this;

		}

	}

	

	/**实现windows式多选习惯*/

	class MyTableUI extends BasicTableUI {

		protected MouseInputListener createMouseInputListener() {

			return new MyMouseInputHandler();

		}



		class MyMouseInputHandler extends MouseInputHandler {

			private boolean ignoreDrag = false;



			public void mousePressed(MouseEvent e) {

				if (e.getClickCount() == 2) {

					table.clearSelection();

				}



				Point origin = e.getPoint();

				int row = table.rowAtPoint(origin);

				int column = table.columnAtPoint(origin);

				if (row != -1 && column != -1) {

					if (table.isCellSelected(row, column)) {

						ignoreDrag = true;

					} else {

						super.mousePressed(e);

					}

				}

			}



			public void mouseClicked(MouseEvent e) {

				super.mouseClicked(e);

			}



			public void mouseDragged(MouseEvent e) {

				if (!ignoreDrag) {

					super.mouseDragged(e);

				} else {

					table.getTransferHandler().exportAsDrag(table, e,

							DnDConstants.ACTION_COPY);



				}

			}



			public void mouseReleased(MouseEvent e) {

				if (ignoreDrag) {

					super.mousePressed(e);

					ignoreDrag = false;

				}

				super.mouseReleased(e);

			}

		}

	}

	

	/**

	 * <br>

	 * 方法说明:得到选中的行 <br>

	 * 输入参数: <br>

	 * 返回类型:

	 */

    public void valueChanged(ListSelectionEvent e) {

    	// System.out.println("valueChanged");

    	super.valueChanged(e);    	

    	m_nRows =  getSelectedRows();

    	if(m_nRows.length == 0) {

    		// 未选中

    		m_nRows = null;

    		m_nRow = -1;

    		return;

    	}



    	if (m_nRows.length == 1) {

    		// 选中一个

    		m_nRows = null;	

    		m_nRow = getSelectedRow();

    		if (m_nRow != -1)

    			m_nRow = sorter.convertRowIndexToModel(m_nRow);

    	} else {

    		//选中多个

    		m_nRow = -1;

    		for (int i = 0; i < m_nRows.length; ++i) {

    			if (m_nRows[i] != -1)

    				m_nRows[i] = sorter.convertRowIndexToModel(m_nRows[i]);

    		}

    	}

    	repaint();

    }

    

    /**

     *<br>方法说明:得到ToolTipText

     *<br>输入参数:

     *<br>返回类型:

     */

    public String getToolTipText() {

    	Point pt = getMousePosition();

    	if (pt == null)

    		return null;

    	int row = rowAtPoint(pt);   

    	if (row == -1)

			return null;

		int index = sorter.convertRowIndexToModel(row);

		if (index == -1)

			return null;

		Dimension tableSize = getSize();

		int width = tableSize.width;

		if (width > 500)

			width = 500;

		if (width < 300)

			width = 300;

		String strText = "<html><table width="

				+ new Integer(width - 50)

				+ "pt border=/"0/" cellpadding=/"0/" cellspacing=/"0/" style=/"TABLE-LAYOUT: fixed/" >"

				+ "<font face=/"dialog/" size=3 color=black>"

				+ model.getValueAt(index).toString() + "</font></table></html>";

		return strText;

	}

}

package com.browser;



import java.util.Vector;

import javax.swing.table.AbstractTableModel;



/**

 * 自定义jtablemodel,配合自定义jtable使用

 * @author dl

 */

public class JMyTableModel extends AbstractTableModel {

	protected Vector all = new Vector();  /**所有数据的列表*/

	

	/**定义表头*/

	protected String[] columnNames;

	

	/**字段类型数组*/

	protected Class[] types;

	

	/**字段可否编辑标记数组*/

    protected boolean[] canEdit;

    

    /**

     *<br>方法说明:得到表格的列数, 继承AbstractTableModel必须实现的方法

     *<br>输入参数:

     *<br>返回类型:int 列数

     */

    public int getColumnCount() {

        return columnNames.length;

    }



    /**

     *<br>方法说明:得到某一列的列名, 继承AbstractTableModel必须实现的方法

     *<br>输入参数:col 列索引

     *<br>返回类型:String 列名

     */

    public String getColumnName(int col) {

        return columnNames[col];

    }



    /**

     *<br>方法说明:返回字段类型

     *<br>输入参数:columnIndex 列索引

     *<br>返回类型:Class

     */

    public Class getColumnClass(int columnIndex) {

        return types [columnIndex];

    }



    /**

     *<br>方法说明:设置字段是否可以编辑

     *<br>输入参数:rowIndex 行索引; columnIndex 列索引

     *<br>返回类型:boolean

     */

    public boolean isCellEditable(int rowIndex, int columnIndex) {

        return canEdit [columnIndex];

    }



    /**

     *<br>方法说明:得到单元格的内容

     *<br>输入参数:rowIndex 行索引; columnIndex 列索引

     *<br>返回类型:boolean

     */

	public Object getValueAt(int rowIndex, int columnIndex) {

		// TODO Auto-generated method stub

		return ((Vector)all.elementAt(rowIndex)).elementAt(columnIndex);

	}

	

	/**

     *<br>方法说明:得到某一行的内容

     *<br>输入参数:rowIndex 行索引

     *<br>返回类型:boolean

     */

	public Object getValueAt(int rowIndex) {

		// TODO Auto-generated method stub

		return all.elementAt(rowIndex);

	}

	

	/**

     *<br>方法说明:清空表格

     *<br>输入参数:

     *<br>返回类型:void

     */

    public void empty() {

    	all.removeAllElements();

    	fireTableDataChanged();

    }



    /**

     *<br>方法说明:设置结果集

     *<br>输入参数:temp 结果集

     *<br>返回类型:void

     */

    public void setRs(Vector vct) {

    	all.addAll(vct);

    	fireTableDataChanged();

    }



    /**

     *<br>方法说明:得到表格的行数

     *<br>输入参数:

     *<br>返回类型:int 列数

     */

	public int getRowCount() {

		// TODO Auto-generated method stub

		return all.size();

	}

}

抱歉!评论已关闭.