⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commontable.java

📁 JAVA 抓包系统~~~提取数据包分析。分离出TCP UDP ARP 等包
💻 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 + -