在Java中調用與系統有關的剪切板Clipboard

java從1.5版開始已經能與系統的剪切板很好的交互了。java

若是能夠在程序中直接調用系統的剪切板來保存「複製」的對象內容,那能夠說的比以前的想法好不少。this

下面是一個對java.io.File對象進行copy,paste操做的例子,雖然還不完善,但能夠在程序中很好的使用。spa

/*
* 定義爲傳輸操做提供數據所使用的類的接口
* 專用於java.io.File類型
*/
package angel.datatransfer;

import java.awt.datatransfer.*;
import java.io.*;

import angel.*;

public class FileTransfer implements Transferable 
{
private File file;

public FileTransfer(File file)
{
   this.file=file;
}

public Object getTransferData(DataFlavor flavor) 
{
   if(isDataFlavorSupported(flavor))
   {
    return file;
   }
   else
   {
    return null;
   }  
}

public DataFlavor[] getTransferDataFlavors()
{
   return new DataFlavor[] {
           new DataFlavor(
            file.getClass(),
            DataFlavor.javaJVMLocalObjectMimeType)};
}

public boolean isDataFlavorSupported(DataFlavor flavor)
{
   return flavor.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType);
} 
}

//在點擊「複製」菜單是,調用:

Transferable trans = new FileTransfer(this.getSelectedFile());
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);

//返回Clipboard剪切板當前的數據
public Object getClipboardData()
{
   try
      {      
       Transferable tran=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
      
       if(tran.isDataFlavorSupported(new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType)))
       {
        Object obj=tran.getTransferData(new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType));
          
          if(obj instanceof File)
           {
            return (File)obj;
           }
           else
           {
            return null;
           }
       }
       else
       {
        return null;
       }
      }
      catch(Exception err)
      {      
       err.printStackTrace();
       return null;
      }
}

另外還發現一個功能,在Java程序中還能夠簡單的監視系統剪切板裏的內容變化,不過若是重複複製同一種類型的數據,好比複製了兩次不一樣內容的文本,只會觸發一次事件:code

//開啓系統剪切板的偵聽器,偵聽器的目標Clipboard更改時調用
      Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(this);

//開啓系統剪切板的偵聽器,偵聽器的目標Clipboard更改時調用
     public void flavorsChanged(FlavorEvent e)
     {
      try
      {      
       Transferable tran=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);       

System.out.println(tran);
      
      }
      catch(Exception err)
      {
       err.printStackTrace();
      }
     }

 

名品推薦:歐緹蔻 陌升 依斯凱菲爾對象

相關文章
相關標籤/搜索