日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 學院 > 開發設計 > 正文

實現Swing的JTables和Excel間的復制和粘貼功能

2019-11-18 14:27:20
字體:
來源:轉載
供稿:網友

  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 中提供的適配器正好做到這一點。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
日韩国产在线不卡视频| 国产成人精品999| 色综合婷婷久久| 亚洲图片小说综合| 一区二区三区精品99久久| 精品区一区二区| 91精品国产自产在线观看永久∴| 国产成人一区二区精品非洲| 精品成人久久av| 久草中文在线观看| 国产网站av| 日韩精品第一区| 久久精品免费在线观看| 日韩精品视频在线免费观看| 亚洲一区视频在线观看视频| 亚洲免费婷婷| 日本黄色一区二区| 日韩视频第二页| 精品1区2区3区| 国产中文伊人| 91www成人久久| 免费看ww视频网站入口| 91精品999| 最近中文字幕在线中文高清版| 日韩三级视频在线| 日韩精品在线视频| 日韩你懂的电影在线观看| 精品日韩欧美在线| 在线亚洲免费| 日韩欧美一级精品久久| 久久久另类综合| 91精品国产免费久久综合| 亚洲校园欧美国产另类| 中文字幕精品在线播放| 久久精品黄色片| 99视频精品全国免费| 亚洲人线精品午夜| 亚洲欧洲国产视频| 亚洲乱码在线观看| 国产福利一区在线观看| 亚洲狠狠婷婷综合久久久久图片| 日韩专区视频网站| 国产三级中文字幕| 国产成人精品三级| 精品全国在线一区二区| 欧美日韩国产999| 国产一区 二区 三区一级| 日韩中文字幕在线视频观看| 在线不卡一区二区| 国产最新在线| 日韩精品综合在线| 亚洲精品中文字幕乱码三区不卡| 偷窥国产亚洲免费视频| 亚洲一区在线观看视频| 国产网站av| 亚洲 欧美 精品| 国产欧美日韩综合| 亚洲国产91精品在线观看| 国产天堂素人系列在线视频| 欧美日韩中文字幕在线视频| 久久久精品网| 国产一区久久| 亚亚洲欧洲精品| 国产高清在线视频| 在线中文免费视频| 亚洲一级影院| 日韩字幕在线观看| 99国内精品| 精品一二三四区| 91精品国产自产观看在线| 内射国产内射夫妻免费频道| 亚洲成年人在线播放| 日韩中文字幕在线视频观看| 日韩中文在线中文网三级| 色欧美日韩亚洲| 国产福利一区二区精品秒拍| 亚洲高清在线观看一区| 欧美国产日韩在线播放| 中文字幕视频一区二区三区久| 中文字幕在线视频久| 色综合天天综合网国产成人综合天| 亚洲综合视频一区| 欧美99久久| 精品国产网站在线观看| 在线视频观看日韩| 91精品蜜臀在线一区尤物| 久久久另类综合| 精品久久久精品| 日韩欧美国产片| 91久久久精品| 亚洲免费福利视频| 日韩欧美成人一区二区三区| 精品久久在线观看| 蜜桃精品在线| 精品播放一区二区| 日韩欧美在线不卡| 国产亚洲视频中文字幕视频| 欧美亚洲国产日韩2020| 日韩av综合在线观看| av免费在线播放| 久久久综合av| 国产日韩精品久久久| 日韩在线视频观看| 久久久99久久| 欧洲精品久久久| 日本不卡高清视频一区| 精品中文在线| 国产乱码午夜在线视频| www日韩欧美| 午夜国产视频| 亚洲黄页一区| www中文字幕在线观看| 久久av免费| 国产视频不卡| 精品婷婷伊人一区三区三| 精品在线网站观看| 日本黄色一区二区| 精品视频www| 亚洲国产午夜精品| 免费看ww视频网站入口| 国产福利第一页| 欧美日韩视频免费| 91精品久久久久| 亚洲第一页中文字幕| 福利在线国产| 欧美成人精品在线| 91久久精品国产| 国产三级做爰在线观看| 日韩欧美在线影院| 国产午夜精品视频| 精品视频—区二区三区免费| 国产网站欧美日韩免费精品在线观看| 欧美日韩高清不卡| 日韩欧美999| 中文字幕在线观看欧美| 中文不卡在线| 精品国产1区二区| 日韩精品大片| 亚洲第一视频| 午夜亚洲一区| 精品国内自产拍在线视频| 久草视频观看| 中文字幕日韩国产| 精品999视频| 99精品电影| 久久精品一级爱片| 中文字幕日韩欧美| 日韩精品视频免费| 精品久久久久久综合日本欧美| 91精品国产综合久久久久久漫画| 91精品国产综合久久久蜜臀粉嫩| 日韩在线播放一区二区| 亚洲欧美中文字幕| 久久中文免费视频| 日本xxxwww免费视频| 亚洲欧洲日产国码av系列天堂| 亚洲一区中文在线| 国产黄色在线观看| www.91香蕉视频| 午夜一区二区三区免费| 92久久精品| 国产成人精品网址| √新版天堂资源在线资源| 久久精品一级爱片| 亚洲a一级视频| 国产日韩中文字幕在线| 日韩国产成人精品| 国产小视频在线观看| 国产不卡视频在线| 精品成a人在线观看| 欧美日韩在线精品成人综合网| 日韩国产欧美亚洲| 精品婷婷伊人一区三区三| 欧美亚洲专区| 极品久久久久久| 久久久另类综合| 欧美xxxx中国| 欧美日韩国产观看视频| 欧美日韩在线不卡| 中文字幕在线官网| 国产日韩在线亚洲字幕中文| 国产主播中文字幕| 日韩中文字幕| 一区二区高清视频| 欧美色视频一区二区三区在线观看| 国产成人精品综合久久久| 久久婷婷综合国产| 91精品综合久久| 欧美日韩国产区| 亚洲一级特黄| 国产 欧美 日韩 在线| 亚洲综合中文字幕在线| 国产 日韩 欧美 综合 一区| 欧美日韩亚洲系列| 另类专区欧美| 国产在线日韩欧美| 欧美日韩在线中文字幕| 欧美国产小视频| 欧美日韩国产一二| 91精品久久久久久久91蜜桃| 欧美日韩国产123区| 免费看黄资源大全高清| 国产调教精品| 亚洲 欧美 中文字幕| 91精品国产自产| 黄色精品在线观看| 中文在线第一页| 黄色视屏免费在线观看| 日韩欧美成人一区二区三区| 在线中文字幕视频| 欧美日韩国产综合视频在线观看| 亚洲一区三区在线观看| 国产乱国产乱老熟300部视频| 韩国v欧美v日本v亚洲| 91麻豆视频网站| 欧美一级二级三级区| 黄色精品在线观看| 亚洲一区不卡在线| 欧美变态tickling挠脚心| 国产黄在线看| 国产不卡视频在线| 精品色蜜蜜精品视频在线观看| 在线观看一区日韩| 国产在线二区| 欧美一级日韩一级| 久久精品日韩欧美| 国产精品福利视频一区二区三区| 欧美日韩中文国产| 国产网站欧美日韩免费精品在线观看| 国产一级片在线| 久久香蕉av| 国产一级粉嫩xxxx| 日韩中文字幕视频在线观看| 一二三区精品视频| 国产三级在线播放| 亚洲欧美999| 国产欧美日韩视频| 在线国产三级| 国产区视频在线观看| 在线观看精品国产| 国产1卡2卡三卡四卡网站| 久久精品免费看| 国产一级片在线| 国产欧美日韩在线观看| 午夜一区二区三区免费| 国产一二三精品| 在线观看免费国产成人软件| 国产欧美日韩在线观看| 男人的天堂网av| 国产不卡在线| 欧美,日韩,国产在线| 亚洲第一视频| 日韩在线a电影| 日韩精品视频在线观看免费| 亚洲大片精品永久免费| 国产一区久久久| av免费观看国产| 中文在线视频| 97视频在线| 国产在线观看a| 精品亚洲综合| av不卡免费看| 久久精品一级爱片| 欧美日韩国产影片| 黄污视频在线看| 欧美三级中文字幕在线观看| 欧美日本精品| 91精品观看| 国产成人综合精品| 99精品在线播放| 日韩欧美在线综合网| 欧美国产日韩在线播放| 欧美日韩精品高清| 中文字幕 日韩 欧美| 日韩欧美国产午夜精品| 久久精品日韩欧美| 顶级网黄在线播放| 91精品免费观看| 99久热re在线精彩视频| 久久99精品久久久| 欧美国产综合在线V| 精品在线99| 欧美国产综合在线V| 日韩国产高清一区| 欧美三级中文字幕| 成人久久久久| av高清一区| 国产欧美日韩三级| 国产欧美高清在线| 国产成人精品免费网站| 欧美日本精品| 69堂精品视频在线播放| 一区二区在线观看不卡| 欧美久久在线观看| 精品播放一区二区| 樱花草www在线| 国产日韩在线视频| 久久电影国产免费久久电影| 亚洲小说春色综合另类电影| 在线视频第一页| 午夜一区二区三区免费| 成人a在线观看| 日韩中文字幕亚洲| 欧美日韩激情一区| 色猫猫国产区一区二在线视频 | 亚洲视频在线观看三级| 中文字幕中文字幕精品| 影音先锋中文字幕在线观看| 国产福利不卡| 欧美日韩精品久久久| 亚洲免费观看视频| 精品色蜜蜜精品视频在线观看| 日韩免费电影网站| 中文av字幕一区| 日本亚洲欧美三级| 亚洲图片小说综合| 国产视频一区三区| 国产高清精品在线| 欧美高清视频一区二区三区| 国产高清在线观看| 国产欧美日韩视频在线| 国产视频二区| 日本xxxwww免费视频| 韩日中文字幕第一页| 午夜少妇久久久久久久久| 一级日韩一级欧美| 日本熟女一区二区| 欧美日韩中文字幕一区| 精品在线一区二区三区| 欧美成人精品在线| 久久91精品视频| 国产中文在线播放| 亚洲日本精品视频| 亚洲福利一区| 欧美日韩亚洲天堂| 国产黄色小视频| 不卡一二三区| 天堂在线中文资源| 中文字幕一区免费| 中文字幕精品www乱入免费视频| 国产三级在线观看视频| 精品久久在线| 高清国产一区| 成人xxxx| 欧美激情一区二区在线| 精品国产欧美日韩不卡在线观看| 精品在线一区二区| 欧美日韩综合视频网址| 日韩欧美三级| 亚洲成av人片| 国产一级免费| 黄色视屏免费在线观看| 国产伦精品免费视频| 色www精品视频在线观看| 樱花草www在线| 成人久久在线| 国产日韩电影| 国产真实乱子伦精品视频| 日韩在线视频一区| 欧美乱大交xxxxx免费| 国产欧美日韩最新| 亚洲欧美99| 精品国产31久久久久久| 日韩欧美中文在线| 中文字幕亚洲区| 国产午夜精品久久| 国产精品一区二三区| 国产激情在线视频| a√免费观看在线网址www| 国产视频中文字幕| 中文在线视频| 蜜桃视频一日韩欧美专区| 欧美日韩亚洲一| 91精品国产色综合久久不卡蜜臀 | 亚洲精品欧美二区三区中文字幕| 亚洲国产欧美日韩在线| 欧美在线亚洲一区| 日韩欧美中文免费| 欧美一卡2卡三卡4卡5免费| 欧美日韩在线视频首页| 欧美日韩久久久| 中文在线中文字幕| 精品久久久久久无| 91精品免费看| 日韩精品视频在线观看视频| 国产香蕉精品视频| 欧美三级精品| 午夜伊人狠狠久久| 国产一级在线免费观看| 久久中文精品| 欧美 日韩 中文字幕| 日韩av一区二区在线观看| 亚洲乱码一区av黑人高潮| 在线观看国产一级片| 91欧美日韩| 日韩午夜一区| 99久久婷婷| 免费视频久久| 日韩视频1区| 国产一区三区三区|