1. 程式人生 > 其它 >讓JTable和Excel貼上複製

讓JTable和Excel貼上複製

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.datatransfer.*;
import java.util.*;
/** 
* ExcelAdapter 實現 JTables 中的複製貼上
* 剪貼簿功能。 介面卡所用的剪貼簿資料格式 
* 與 Excel 所用的剪貼簿格式相容。這提供了 
* 支援的 JTables 和 Excel 間的互操作。 
*/

public class ExcelAdapter implements ActionListener
{
	private String rowstring,value;
	private Clipboard system;
	private StringSelection stsel;
	private JTable jTable1 ;
	/** 
	* Excel 介面卡由 JTable 構成,
	* 它實現了 JTable 上的複製貼上 
	* 功能,並充當剪貼簿監聽程式。
	*/
	public ExcelAdapter(JTable myJTable)
	{
		jTable1 = myJTable;
		KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK,false);
		// 確定複製按鍵使用者可以對其進行修改
		// 以實現其它按鍵組合的複製功能。
		KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK,false);
		// 確定貼上按鍵使用者可以對其進行修改
		// 以實現其它按鍵組合的複製功能。
		jTable1.registerKeyboardAction(this,"Copy",copy,JComponent.WHEN_FOCUSED);
		jTable1.registerKeyboardAction(this,"Paste",paste,JComponent.WHEN_FOCUSED);
		system = Toolkit.getDefaultToolkit().getSystemClipboard();
	}
	/**
	* 此介面卡執行圖表的公共讀方法。
	*/
	public JTable getJTable() {return jTable1;}
	public void setJTable(JTable jTable1) {this.jTable1=jTable1;}
	/**
	* 在我們監聽此實現的按鍵上啟用這種方法。
	* 此處,它監聽複製和貼上 ActionCommands。
	* 包含不相鄰單元格的選擇導致選擇無效,
	* 而且此後複製動作無法執行。
	* 貼上的方法是將選定內容的左上角與
	* JTable 的當前選定內容的第一個元素對齊。
	*/
	public void actionPerformed(ActionEvent e)
	{
		if (e.getActionCommand().compareTo("Copy")==0)
		{
			StringBuffer sbf=new StringBuffer();
		// 檢查以確保我們僅選擇了單元格的
		// 相鄰塊
			int numcols=jTable1.getSelectedColumnCount();
			int numrows=jTable1.getSelectedRowCount();
			int[] rowsselected=jTable1.getSelectedRows();
			int[] colsselected=jTable1.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, "Invalid Copy Selection",
						"Invalid Copy Selection",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			for (int i=0;i<numrows;i++){
				for (int j=0;j<numcols;j++){
					sbf.append(jTable1.getValueAt(rowsselected[i],colsselected[j]));
					if (j<numcols-1){
						 sbf.append("\t");
					}
				}
				sbf.append("\n");
			}
			stsel = new StringSelection(sbf.toString());
			system = Toolkit.getDefaultToolkit().getSystemClipboard();
			system.setContents(stsel,stsel);
		}
		if (e.getActionCommand().compareTo("Paste")==0){
			System.out.println("Trying to Paste");
			int startRow=(jTable1.getSelectedRows())[0];
			int startCol=(jTable1.getSelectedColumns())[0];
			try{
				String trstring= (String)(system.getContents(this).
				getTransferData(DataFlavor.stringFlavor));
				System.out.println("String is:"+trstring);
				StringTokenizer st1=new StringTokenizer(trstring," ");
				String[] rowContents = trstring.split("\n");
				if(rowContents != null && rowContents.length > 0){
					for(int rowIndex=0;rowIndex < rowContents.length; rowIndex++){
						String rowContent = rowContents[rowIndex];
						String[] columnContents = rowContent.split("\t");
						if(columnContents != null && columnContents.length > 0){
							for(int columnIndex=0;columnIndex<columnContents.length;columnIndex++){
								String value = columnContents[columnIndex];
								jTable1.setValueAt(value, startRow+rowIndex, startCol+columnIndex);
							}
						}
					}
				}
//				System.out.println();
//				for(int i=0;st1.hasMoreTokens();i++)
//				{
//					rowstring=st1.nextToken();
//					StringTokenizer st2=new StringTokenizer(rowstring," ");
//					for(int j=0;st2.hasMoreTokens();j++)
//					{
//					value=(String)st2.nextToken();
//					if (startRow+i< jTable1.getRowCount() &&
//					startCol+j< jTable1.getColumnCount())
//					jTable1.setValueAt(value,startRow+i,startCol+j);
//					System.out.println("Putting "+ value+"atrow="+startRow+i+"column="+startCol+j);
//					}
//				}
			}
			catch(Exception ex){
				ex.printStackTrace();
			}
		}
	}
}