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 stubreturn ((Vector)all.elementAt(rowIndex)).elementAt(columnIndex);}/** *<br>方法說明:得到某一行的內容 *<br>輸入參數:rowIndex 行索引 *<br>傳回型別:boolean */public Object getValueAt(int rowIndex) {// TODO Auto-generated method stubreturn 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 stubreturn all.size();}}