国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

實現(xiàn)Swing的JTables和Excel間的復制和粘貼功能

2019-11-18 14:27:20
字體:
供稿:網(wǎng)友

  JTable 和 Excel 圖表是常被用在網(wǎng)格或表格中顯示數(shù)據(jù)。通常,用戶希望輸入到 JTable 的數(shù)據(jù)已經(jīng)存在于 Excel 電子表格中。Excel 格式使用在非 Excel 軟件中來實現(xiàn)導入-導出功能。因為如此,java 軟件也應(yīng)該提供通用的剪貼板功能,例如在 JTable 和 Excel 間復制和粘貼。本文展示了如何使用系統(tǒng)粘貼板在 Java 程序和 Excel 間復制數(shù)據(jù)。使用這一 Java 技巧中提供的適配器類,只需一行代碼即可添加在 JTables 和 Excel 間復制和粘貼信息的功能。請注重,由于未簽名的 applet 不能使用系統(tǒng)剪貼板,此功能不適用于這些 Java 程序。

當今很多業(yè)務(wù)應(yīng)用程序都是使用 Java 開發(fā)的,并且以后這種用 Java 開發(fā)的應(yīng)用會更多。而在許多應(yīng)用程序都使用了 Swing 的 JTable 組件,以類似電子表格的格式顯示數(shù)據(jù)。假如業(yè)務(wù)應(yīng)用程序可以將數(shù)據(jù)導入 Microsoft Excel 和從 Microsoft Excel 中導出數(shù)據(jù),則會為用戶帶來方便,使用戶可以使用無處不在的該電子表格程序的強大功能。此 Java 技巧將幫助您理解系統(tǒng)剪貼板,并使您的 JTable 能夠與 Excel 交互和互操作。您將看到,通過在當前應(yīng)用程序中僅僅添加另外的一行代碼即可實現(xiàn)這一有用功能的添加。

要實現(xiàn)這一目標,需要做的只是復制這里給出的文件 ExcelAdapter.java,對其進行編譯,并確保您的應(yīng)用程序可以找到 ExcelAdapter.class 文件;做完后,JTable 就可以與 Excel 進行通話了!我們將向您展示僅通過這一行代碼,如何實現(xiàn)到 Excel 的復制 (Ctrl+C) 和粘貼 (Ctrl+V) 以及從 Excel 進行的復制和粘貼。另外還提供了一個使用 ExcelAdapter 的示例應(yīng)用程序。

代碼
下面是實際完成此任務(wù)的適配器代碼(稱為 ExcelAdapter.java):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.datatransfer.*;
import java.util.*;
/**
* ExcelAdapter 實現(xiàn) JTables 中的復制粘貼
* 剪貼板功能。 適配器所用的剪貼板數(shù)據(jù)格式
* 與 Excel 所用的剪貼板格式兼容。這提供了
* 支持的 JTables 和 Excel 間的互操作。
*/
public class ExcelAdapter implements ActionListener
{
PRivate String rowstring,value;
private Clipboard system;
private StringSelection stsel;
private JTable jTable1 ;
/**
* Excel 適配器由 JTable 構(gòu)成,
* 它實現(xiàn)了 JTable 上的復制粘貼
* 功能,并充當剪貼板監(jiān)聽程序。
*/
public ExcelAdapter(JTable myJTable)
{
jTable1 = myJTable;
KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK,false);
// 確定復制按鍵用戶可以對其進行修改
// 以實現(xiàn)其它按鍵組合的復制功能。
KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK,false);
// 確定粘貼按鍵用戶可以對其進行修改
// 以實現(xiàn)其它按鍵組合的復制功能。
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;}
/**
* 在我們監(jiān)聽此實現(xiàn)的按鍵上激活這種方法。
* 此處,它監(jiān)聽復制和粘貼 ActionCommands。
* 包含不相鄰單元格的選擇導致選擇無效,
* 而且此后復制動作無法執(zhí)行。
* 粘貼的方法是將選定內(nèi)容的左上角與
* JTable 的當前選定內(nèi)容的第一個元素對齊。
*/
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();}
}
}
}

示例應(yīng)用程序
下面是示例應(yīng)用程序 Frame1.java,它使用 ExcelAdapter 實現(xiàn) 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 的剪貼板格式非常簡單。它采用制表符分隔同一行上的元素,并用換行符分隔行。這樣,當您復制一組連續(xù)的和/或相鄰的單元格時,Excel 只將電子表格數(shù)據(jù)標記到一個長字符串中,各個單元格值由該字符串內(nèi)的制表符和換行符分隔。假如所選的單元格不相鄰時怎么辦?很簡單:Excel 不會讓您將所選內(nèi)容復制到剪貼板。這種行為由本文所說明的適配器模擬,假如所選擇的單元格不相鄰,也不會使您復制數(shù)據(jù)。在 Excel 中,會彈出一個對話框告訴我們不答應(yīng)復制;這一行為由適配器再次模擬。

代碼簡單解釋
要使用這一功能,您需要下載 ExcelAdapter.java 文件,對其進行編譯,將示例應(yīng)用程序中的最后一行添加到您代碼中的某個位置,以激活 JTable 上的適配器。

在適配器中,復制和粘貼功能的激活按鍵都經(jīng)過了注冊。其后,無論何時鍵入激活的按鍵, actionPerformed 方法就會被調(diào)用。假如是復制操作,則所選擇的單元格數(shù)據(jù)都會為 Excel 進行適當?shù)臉擞洠懭胂到y(tǒng)剪貼板中。假如是粘貼操作,則將系統(tǒng)剪貼板中的數(shù)據(jù)轉(zhuǎn)換為字符串形式,并經(jīng)過分析,根據(jù)所選擇的單元格植入 JTables 單元格中。

結(jié)論
使用用 Java 編寫的表格的用戶經(jīng)常希望 Jtables 中的數(shù)據(jù)與 Excel 中的數(shù)據(jù)處理方法相似。它并不是編寫代碼來實現(xiàn)每個 JTable 上的復制-粘貼功能,而是更為簡單地編寫通用的適配器,只需添加一行代碼即可將所需功能添加到每個 Jtable 中。此 Java Tip 中提供的適配器正好做到這一點。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 庆元县| 湖州市| 卢龙县| 新郑市| 白沙| 福州市| 阳高县| 巴楚县| 抚顺市| 桦南县| 许昌市| 三河市| 光泽县| 五家渠市| 彭阳县| 特克斯县| 兴海县| 莎车县| 怀集县| 厦门市| 咸阳市| 阳城县| 牟定县| 浏阳市| 青阳县| 怀柔区| 肇东市| 县级市| 金堂县| 乌拉特中旗| 华亭县| 虞城县| 宝兴县| 中西区| 定兴县| 肃南| 江永县| 邯郸市| 涡阳县| 龙南县| 湖南省|