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