zoukankan      html  css  js  c++  java
  • 在Java中调用与系统有关的剪切板Clipboard

    java从1.5版开始已经能与系统的剪切板很好的交互了。

    如果可以在程序中直接调用系统的剪切板来保存“复制”的对象内容,那可以说的比之前的想法好很多。

    下面是一个对java.io.File对象进行copy,paste操作的例子,虽然还不完善,但可以在程序中很好的使用。

    /*
    * 定义为传输操作提供数据所使用的类的接口
    * 专用于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程序中还可以简单的监视系统剪切板里的内容变化,不过如果重复复制同一种类型的数据,比如复制了两次不同内容的文本,只会触发一次事件:

    //开启系统剪切板的侦听器,侦听器的目标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();
          }
         }
  • 相关阅读:
    delphi7 stringgrid 点列头排序
    如何作为一个优秀的ERP实施顾问
    小米生态链去年收入150亿,今年目标200亿
    msys2 安装笔记(可以按照这个关键字搜索)
    MinGW 编译 libsndfile-1.0.25(只要有 MSYS,./configure make make install 就行了)
    Apache Ignite——新一代数据库缓存系统
    VS2015 C#6.0
    Webuploader 大文件分片上传
    requirejs
    require.js
  • 原文地址:https://www.cnblogs.com/personnel/p/4582852.html
Copyright © 2011-2022 走看看