posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Java提供的剪貼板[轉(zhuǎn)]

          Posted on 2008-06-05 16:45 semovy 閱讀(497) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA基礎(chǔ)

          Java提供的剪貼板

          Java提供兩種類型的剪貼板:系統(tǒng)的和本地的.
          本地剪貼板只在當(dāng)前虛擬機(jī)中有效.Java允許多個(gè)本地剪貼板同時(shí)存在,可以方便地通過(guò)剪貼板的名稱來(lái)進(jìn)行存取訪問(wèn).
          系統(tǒng)剪貼板與同等操作系統(tǒng)直接關(guān)連,允許應(yīng)用程序與運(yùn)行在該操作系統(tǒng)下的其它程序之間進(jìn)行信息交換.

          在進(jìn)一步深入之前,先看看與剪貼板相同的java類,這些類主要包含在java.awt.datatransfer包中,主要有以下幾種:
          Clipboard類: 處理任何可以被傳遞的對(duì)象.
          ClipboardOwner接口: 任何處理剪貼板的類都必須實(shí)現(xiàn)該接口.該接口用于剪貼板中的原始數(shù)據(jù)被替換時(shí)發(fā)出通知.
          Dataflavor類: 表現(xiàn)被傳遞的對(duì)象支持的所有數(shù)據(jù)類型.
          StringSelection類: java支持的一種可被傳遞的類.
          Transferable接口: 包裝傳遞到剪貼板的對(duì)象.
          UnsupportedFlavor Exception類: 由可傳遞對(duì)象拋出的異常,表示不對(duì)象的數(shù)據(jù)類型(data flavor)

          Clipboard類
          Clipboard是存取剪貼板的鏈接.它包含三個(gè)方法:
          String getName()
          void setContents(Transferable, ClipboardOwner)
          Transferable getContent(Object)
          訪問(wèn)系統(tǒng)剪貼板,可以瘵系統(tǒng)剪貼板的引用賦值給一個(gè)Clipboard對(duì)象,如:
          Clipboard clipboard = getToolKit().getSystemClipboard();
          創(chuàng)建一個(gè)本地剪貼板,可以通過(guò)傳遞剪貼板的名稱到構(gòu)造方法中:
          Clipboard clipboard = new Clipboard("My first clipboard");

          ClipboardOwner接口
          ClipboardOwner唯一的功能就是當(dāng)(剪貼板)擁有者的數(shù)據(jù)被其它類覆蓋時(shí)通知它.同時(shí)它可以用用通知應(yīng)用程序釋放關(guān)聯(lián)到數(shù)據(jù)的資源的信號(hào).
          在具體應(yīng)用中,lostOwnership方法可以用于設(shè)置標(biāo)志,該標(biāo)志用于通知應(yīng)用有關(guān)剪貼板中數(shù)據(jù)的可見(jiàn)性


          java.awt.datatransfer.Clipboard clipboard=java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); //獲得系統(tǒng)剪切板

          //下面是我的記事本部分功能.e.getSource()是當(dāng)觸發(fā)了某個(gè)事件.這里是copy的代碼,下面依此是粘貼,等代碼.可以看你需要的部分.(關(guān)于clopboard的).都是漢語(yǔ)拼音命名的變良.

          else if(e.getSource()==fuZhi||e.getSource()==fuZhi2)//////////Copy 'fuZhi' is 'Copy'
          {
          String temp=text.getSelectedText();
          stringSelection=new StringSelection(temp);
          clipboard.setContents(stringSelection,null);
          }

          else if(e.getSource()==jianQie||e.getSource()==jianQie2)//////////'jianQie' is 'Cut'
          {
          String temp=text.getSelectedText();
          stringSelection=new StringSelection(temp);
          clipboard.setContents(stringSelection,null);
          int start=text.getSelectionStart();
          int end=text.getSelectionEnd();
          text.replaceRange("",start,end);
          }
          //這里是粘貼.主要是如何從系統(tǒng)剪切板里取得數(shù)據(jù).
          else if(e.getSource()==zhanTie||e.getSource()==zhanTie2)///////////////'zhanTie' is 'Paste'.
          {
          java.awt.datatransfer.Transferable transferable=clipboard.getContents(this);
          java.awt.datatransfer.DataFlavor flavor=java.awt.datatransfer.DataFlavor.stringFlavor;
          if(transferable.isDataFlavorSupported(flavor))
          {
          try
          {
          int start=text.getSelectionStart();
          int end=text.getSelectionEnd();
          text.replaceRange("",start,end);
          String str;
          int n=text.getCaretPosition();
          str=(String)transferable.getTransferData(flavor);
          text.insert(str,n);
          }
          catch(Exception ee)
          {

          }
                }
          }
          java.awt.datatransfer.Transferable transferable=clipboard.getContents(this);//傳送操作提供數(shù)據(jù)的類定義接口.放在剪切板的東西都實(shí)現(xiàn)了這個(gè)接口.

          java.awt.datatransfer.DataFlavor flavor=java.awt.datatransfer.DataFlavor.stringFlavor//在數(shù)據(jù)拖放期間,或在文件系統(tǒng)中,當(dāng)每個(gè)實(shí)例顯示在剪切板上時(shí),它代表了數(shù)據(jù)格式的不透明概念.其實(shí)就是在系統(tǒng)內(nèi)存中的東西是哪種類型.比如:文本,圖片等.就象網(wǎng)頁(yè)中的contentType="text/html"等一樣.這里的stringFlavor是字符類型.
           
           
          通過(guò)操作系統(tǒng)的剪切板,可以實(shí)現(xiàn)在不同的程序中拷貝和粘貼數(shù)據(jù)。一些用Java寫(xiě)的程序例如很多開(kāi)發(fā)環(huán)境也可以訪問(wèn)到剪切板,本文就是研究如何在Java程序中讀寫(xiě)系統(tǒng)剪切板的數(shù)據(jù)。
          通過(guò)操作系統(tǒng)的剪切板,可以實(shí)現(xiàn)在不同的程序中拷貝和粘貼數(shù)據(jù)。一些用Java寫(xiě)的程序例如很多開(kāi)發(fā)環(huán)境也可以訪問(wèn)到剪切板,本文就是研究如何在Java程序中讀寫(xiě)系統(tǒng)剪切板的數(shù)據(jù)。

          Java中使用java.awt.datatransfer.Clipboard類來(lái)描述剪切板,并把剪切板分為兩種類型:本地和系統(tǒng),本地剪切板使用 Clipborad cp = new Clipboard("clip1"); 來(lái)構(gòu)造;系統(tǒng)剪切板通過(guò)

          Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();

          獲取,下面我們給出幾個(gè)常用的方法用于讀寫(xiě)剪切板中的文本數(shù)據(jù)以及圖像數(shù)據(jù)

          1. 從指定的剪切板中獲取文本內(nèi)容

          protected static String getClipboardText(Clipboard clip) throws Exception{
             // 獲取剪切板中的內(nèi)容
             Transferable clipT = clip.getContents(null);
             if (clipT != null) {
              // 檢查內(nèi)容是否是文本類型
              if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
               return (String)clipT.getTransferData(DataFlavor.stringFlavor);
             }
             return null;
          }


          2. 往剪切板寫(xiě)文本數(shù)據(jù)

          protected static void setClipboardText(Clipboard clip, String writeMe) {
             Transferable tText = new StringSelection(writeMe);
             clip.setContents(tText, null);
          }


          3. 從剪切板讀取圖像

          public static Image getImageFromClipboard() throws Exception{
             Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
             Transferable cc = sysc.getContents(null);
             if (cc == null)
              return null;
             else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor))
              return (Image)cc.getTransferData(DataFlavor.imageFlavor);
             return null;
          }


          4. 寫(xiě)圖像到剪切板

          protected static void setClipboardImage2(final Image image) {
             Transferable trans = new Transferable(){
              public DataFlavor[] getTransferDataFlavors() {
               return new DataFlavor[] { DataFlavor.imageFlavor };
              }
              public boolean isDataFlavorSupported(DataFlavor flavor) {
               return DataFlavor.imageFlavor.equals(flavor);
              }
              public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
               if(isDataFlavorSupported(flavor))
                return image;
               throw new UnsupportedFlavorException(flavor);
              }
             
             };
             Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);
          }
           

          有了這四個(gè)方法,你下面可以自己寫(xiě)一些程序來(lái)進(jìn)行測(cè)試,利用它來(lái)實(shí)現(xiàn)與其他程序結(jié)合測(cè)試對(duì)剪切板數(shù)據(jù)的操作。這里給出一個(gè)用于顯示圖像的類,只要把Image實(shí)例作為參數(shù)傳入即可。

          /*
          * Created on 2004-12-23
          * 查看圖形的窗口
          */
          package javayou.clipboard;

          import java.awt.Frame;
          import java.awt.Graphics;
          import java.awt.Image;
          import java.awt.MediaTracker;
          import java.awt.event.WindowAdapter;
          import java.awt.event.WindowEvent;

          /**
          * @author Winter Lau 用于顯示圖形的窗口
          */
          public class ImageViewer extends Frame {

          private Image image;

          /**
             * 顯示一個(gè)圖像
             * @param viewMe
             */
          public ImageViewer(Image viewMe) {
             image = viewMe;
             MediaTracker mediaTracker = new MediaTracker(this);
             mediaTracker.addImage(image, 0);
             try {
              mediaTracker.waitForID(0);
             } catch (InterruptedException ie) {
              ie.printStackTrace();
              System.exit(1);
             }
             addWindowListener(new WindowAdapter() {
              public void windowClosing(WindowEvent e) {
               System.exit(0);
              }
             });
             //窗口適應(yīng)圖像大小
             setSize(image.getWidth(null), image.getHeight(null));
             //窗口標(biāo)題
             setTitle("Viewing Image from Clipboard");  
             setVisible(true);
          }

          public void paint(Graphics graphics) {
             graphics.drawImage(image, 0, 0, null);
          }

          /**
             * 用于讀取圖像文件并生成Image對(duì)象
             */
          public static Image getImageFromFile(String fileName) {
             Toolkit toolkit = Toolkit.getDefaultToolkit();
             Image image = toolkit.getImage(fileName);
             return image;
          }

          }
          主站蜘蛛池模板: 区。| 长乐市| 武川县| 山东省| 金山区| 嵊泗县| 宽甸| 互助| 平昌县| 万源市| 兰考县| 康保县| 石棉县| 鄄城县| 忻州市| 资中县| 万年县| 莎车县| 齐齐哈尔市| 光泽县| 喀什市| 利辛县| 攀枝花市| 汪清县| 桂东县| 天气| 芦溪县| 枣阳市| 宝兴县| 家居| 海门市| 龙游县| 涟源市| 乳山市| 祁阳县| 鹤岗市| 长治市| 正安县| 连城县| 吴桥县| 柯坪县|