1. 程式人生 > 其它 >Swing中JTable和Excel間的複製貼上功能

Swing中JTable和Excel間的複製貼上功能

Swing中JTable和Excel間的複製貼上功能

JTable 和 Excel 圖表是常被用在網格或表格中顯示資料。通常,使用者希望輸入到 JTable 的資料已經存在於 Excel 電子表格中。Excel 格式使用在非 Excel 軟體中來實現匯入-匯出功能。因為如此,Java 軟體也應該提供通用的剪貼簿功能,例如在 JTable 和 Excel 間複製和貼上。本文展示瞭如何使用系統貼上板在 Java 程式和 Excel 間複製資料。使用這一 Java 技巧中提供的介面卡類,只需一行程式碼即可新增在 JTables 和 Excel 間複製和貼上資訊的功能。請注意,由於未簽名的 applet 不能使用系統剪貼簿,此功能不適用於這些 Java 程式。

當今很多業務應用程式都是使用 Java 開發的,並且以後這種用 Java 開發的應用會更多。而在許多應用程式都使用了 Swing 的 JTable 元件,以類似電子表格的格式顯示資料。如果業務應用程式可以將資料匯入 Microsoft Excel 和從 Microsoft Excel 中匯出資料,則會為使用者帶來方便,使使用者可以使用無處不在的該電子表格程式的強大功能。此 Java 技巧將幫助您理解系統剪貼簿,並使您的 JTable 能夠與 Excel 互動和互操作。您將看到,通過在當前應用程式中僅僅新增另外的一行程式碼即可實現這一有用功能的新增。

要實現這一目標,需要做的只是複製這裡給出的檔案 ExcelAdapter.java,對其進行編譯,並確保您的應用程式可以找到 ExcelAdapter.class 檔案;做完後,JTable 就可以與 Excel 進行通話了!我們將向您展示僅通過這一行程式碼,如何實現到 Excel 的複製 (Ctrl+C) 和貼上 (Ctrl+V) 以及從 Excel 進行的複製和貼上。另外還提供了一個使用 ExcelAdapter 的示例應用程式。

程式碼

下面是實際完成此任務的介面卡程式碼(稱為 ExcelAdapter.java):

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(" ");
}
sbf.append(" ");
}
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," ");
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+"at
row="+startRow+i+"column="+startCol+j);
}
}
}
catch(Exception ex){ex.printStackTrace();}
}
}
}

示例應用程式

下面是示例應用程式 Frame1.java,它使用 ExcelAdapter 實現 JTable 與 Excel 的相容。

import java.awt.*;
import javax.swing.*;
public class Frame1 extends Frame
{
BorderLayout borderLayout1 = new BorderLayout();
JTable jTable1 ;
Object[][] data=new Object[4][4];
Object header[]= {"Jan","Feb","Mar","Apr"};
public static void main(String args[])
{
Frame1 myframe=new Frame1();
myframe.setSize(new Dimension(250,250));
myframe.setVisible(true);
}
public Frame1()
{
super();
try
{
jbInit();
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
data[i][j]=new Integer(i*10+j);
System.out.println("Header length="+header[1]);
jTable1=new JTable(data,header);
jTable1.setCellSelectionEnabled(true);
this.setTitle("Excel Lent JTABLE");
jTable1.setBackground(Color.pink);
this.setLayout(borderLayout1);
this.setSize(new Dimension(400, 300));
this.setBackground(Color.white);
this.add(jTable1, BorderLayout.CENTER);
// 這就是新增複製和貼上功能的那一行!
ExcelAdapter myAd = new ExcelAdapter(jTable1);
}
}

Excel 的剪貼簿格式

Excel 的剪貼簿格式非常簡單。它採用製表符分隔同一行上的元素,並用換行符分隔行。這樣,當您複製一組連續的和/或相鄰的單元格時,Excel 只將電子表格資料標記到一個長字串中,各個單元格值由該字串內的製表符和換行符分隔。如果所選的單元格不相鄰時怎麼辦?很簡單:Excel 不會讓您將所選內容複製到剪貼簿。這種行為由本文所說明的介面卡模仿,如果所選擇的單元格不相鄰,也不會使您複製資料。在 Excel 中,會彈出一個對話方塊告訴我們不允許複製;這一行為由介面卡再次模仿。

程式碼簡單解釋

要使用這一功能,您需要下載 ExcelAdapter.java 檔案,對其進行編譯,將示例應用程式中的最後一行新增到您程式碼中的某個位置,以啟用 JTable 上的介面卡。

在介面卡中,複製和貼上功能的啟用按鍵都經過了註冊。其後,無論何時鍵入啟用的按鍵, actionPerformed 方法就會被呼叫。如果是複製操作,則所選擇的單元格資料都會為 Excel 進行適當的標記,並寫入系統剪貼簿中。如果是貼上操作,則將系統剪貼簿中的資料轉換為字串形式,並經過分析,根據所選擇的單元格植入 JTables 單元格中。

結論

使用用 Java 編寫的表格的使用者常常希望 Jtables 中的資料與 Excel 中的資料處理方法相似。它並不是編寫程式碼來實現每個 JTable 上的複製-貼上功能,而是更為簡單地編寫通用的介面卡,只需新增一行程式碼即可將所需功能新增到每個 Jtable 中。此 Java Tip 中提供的介面卡正好做到這一點。

from:https://blog.csdn.net/ycb1689/article/details/12613711

歡迎好評!