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