📄 commontable.java
字号:
package ip.class3.table;
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
/**
* 表格公共模板
* 此模板能实现粘贴、复制、排序、增加和删除行
* @author 蒲德祥
*
*/
public class CommonTable extends JPanel{
/**
*
*/
private static final long serialVersionUID = 1L;
private DefaultTableModel middTable;
public JTable table;
private JScrollPane scrollPanel;//滚动面板
private JPopupMenu popMenu;//弹起菜单
private JMenuItem selectAllMenu;//菜单内容
private JMenuItem copyMenu;
private JMenuItem pastMenu;
private JMenuItem addRowMenu;
private JMenuItem delRowMenu;
private String []title;//标题
private String [][]data;//内容
/**
* 只有表头的表格
* 表格默认设置20行
* @param title
*/
public CommonTable(String []title) {
setTitle(title);
data = new String[20][title.length];
for(int i = 0; i <20; i++) {
for(int j = 0; j < title.length; j++)
data[i][j] = new String("");
}
setTable(0);
}
/**
* 构造表格
* @param data
* @param title
*/
public CommonTable(String [][]data, String []title) {
setTitle(title);
setCells(data);
setTable(1);
}
/**
* 设置表格的表头、单元格内容
* 映射表格的排序,设置表格弹起菜单
* @param k
*/
public void setTable(int k) {
mouseRight();
this.setLayout(new BorderLayout());
if(k == 0)
middTable = new DefaultTableModel(this.title, 0);
else if(k == 1)
middTable = new DefaultTableModel(this.data, this.title);
TableSorter sorter = new TableSorter(middTable);//设置排序
table = new JTable(sorter);
sorter.setTableHeader(table.getTableHeader()); //排序标题
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
table.setCellSelectionEnabled(true);//设置单元格选择方式
table.setShowVerticalLines(true);//设置是否显示单元格间的分割线
table.setShowHorizontalLines(true);
table.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent e) {
//获得鼠标右键事件
if(SwingUtilities.isRightMouseButton(e)) {
popMenu.show(table,e.getX(),e.getY());
}
}
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
});
scrollPanel = new JScrollPane(table);
this.add(scrollPanel, BorderLayout.CENTER);
}
/**
* 设置表格标题
* @param title
*/
public void setTitle(String []title) {
this.title = new String[title.length];
for(int i = 0; i < title.length; i++) {
this.title[i] = new String(title[i]);
}
}
/**
* 获得表格表头
* @return 表头
*/
public String[] getTitle() {
return this.title;
}
/**
* 设置单元格的内容
* @param data
*/
public void setCells(String [][]data) {
System.out.println(data.length);
this.data = new String[data.length][data[0].length];
for(int i = 0; i < data.length; i++)
for(int j = 0; j < data[0].length; j++) {
this.data[i][j] = data[i][j];
}
}
public String[][] getCells() {
return this.data;
}
/**
* 在表格末尾增加行
*/
public void addRow(Vector vec) {
middTable.addRow(vec);
middTable.fireTableStructureChanged();
}
/**
* 删除选中行
* @param row
*/
public void delRow(int row) {
int rowCount = middTable.getRowCount();
rowCount--;
middTable.removeRow(row);
middTable.setRowCount(rowCount);
middTable.fireTableDataChanged();
middTable.fireTableStructureChanged();
}
/**
* 设置弹起菜单内容
* @return 弹起菜单
*/
public JPopupMenu mouseRight() {
popMenu = new JPopupMenu();
selectAllMenu = new JMenuItem("全选");
copyMenu = new JMenuItem("复制");
pastMenu = new JMenuItem("粘贴");
addRowMenu = new JMenuItem("增加行");
delRowMenu = new JMenuItem("删除行");
selectAllMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
table.setRowSelectionInterval(0, table.getRowCount()-1);
table.setColumnSelectionInterval(0, table.getColumnCount()-1);
}
});
copyMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
copy();
}
});
pastMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
past();
}
});
addRowMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addRow(new Vector());
}
});
delRowMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(table.getRowCount() > 0) {
if( table.isRowSelected(table.getSelectedRow()))
delRow(table.getSelectedRow());
else
JOptionPane.showMessageDialog(null, "请将要删除的行选中!!",
"Invalid Copy Selection",
JOptionPane.ERROR_MESSAGE);
}
}
});
popMenu.add(selectAllMenu);
popMenu.addSeparator();
popMenu.add(copyMenu);
popMenu.add(pastMenu);
popMenu.addSeparator();
popMenu.add(addRowMenu);
popMenu.add(delRowMenu);
return popMenu;
}
/**
* 复制表格内容
* 表格中选中的内容将被复制
*/
public void copy() {
Clipboard system = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection stsel;
StringBuffer buffer = new StringBuffer();
int numcols = table.getSelectedColumnCount();//复制表格的起始列
int numrows = table.getSelectedRowCount();//复制表格的起始行
int[] rowsselected = table.getSelectedRows();//复制行的数目
int[] colsselected = table.getSelectedColumns();//复制列的数目
if (!((numrows-1 == rowsselected[rowsselected.length-1]-rowsselected[0]
&& numrows == rowsselected.length)
&& (numcols-1 == colsselected[colsselected.length-1]-colsselected[0]
&& numcols == colsselected.length))) {
JOptionPane.showMessageDialog(null, "无法复制,复制内容为空",
"复制失败",
JOptionPane.ERROR_MESSAGE);
return;
}
for (int i=0;i<numrows;i++) {
for (int j=0;j<numcols;j++) {
buffer.append(table.getValueAt(rowsselected[i],colsselected[j]));
if (j<numcols-1)
buffer.append("\t");
}
buffer.append("\n");
}
stsel = new StringSelection(buffer.toString());
system = Toolkit.getDefaultToolkit().getSystemClipboard();
system.setContents(stsel,stsel);//将复制的内容放大粘贴板上
}
/**
* 从粘贴板上将数据粘贴到表格
*/
public void past() {
Clipboard system = Toolkit.getDefaultToolkit().getSystemClipboard();
String rowstring,value;
int startRow=(table.getSelectedRows())[0];
int startCol=(table.getSelectedColumns())[0];
//处理粘贴板的内容
//将回车和table健分离后,将其内容准确放到相应的单元格里面
try {
String trstring= (String)(system.getContents(this).
getTransferData(DataFlavor.stringFlavor));
StringTokenizer st1=new StringTokenizer(trstring,"\n");
for(int i=0;st1.hasMoreTokens();i++) {
rowstring=st1.nextToken();
StringTokenizer st2=new StringTokenizer(rowstring,"\t");
for(int j=0;st2.hasMoreTokens();j++) {
value=(String)st2.nextToken();
if (startRow+i< table.getRowCount() &&
startCol+j< table.getColumnCount())
table.setValueAt(value,startRow+i,startCol+j);
}
}
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null,
"粘贴失败,粘贴板的内容是空的",
"Invalid Copy Selection",
JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -