在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();
      }
     }
时间: 2024-11-06 16:14:49

在Java中调用与系统有关的剪切板Clipboard的相关文章

java中的io系统详解

java中的io系统详解 分类: JAVA开发应用 笔记(读书.心得)2009-03-04 11:26 46118人阅读 评论(37) 收藏 举报 javaiostreamconstructorstringbyte 相关读书笔记.心得文章列表 Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他

java中调用dll文件的两种方法

一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNative地址:http://www.jb51.net/article/35232.htm JNA方法: 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

在java中调用Oracle存储过程

在java中调用Oracle存储过程 本文介绍如何通过java来调用Oracle的存储过程 1. 编写存储过程 CREATE OR REPLACE PROCEDURE sp_pro3(sp_name VARCHAR2,sp_sal NUMBER ) IS BEGIN --根据用户名修改工资 UPDATE emp SET sal=sp_sal WHERE ename=sp_name; END; 引入jdbc6.jar,编写测试类Test.java package testOraclePro; im

JAVA中获取当前系统时间及格式转换

JAVA中获取当前系统时间 一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowString {public static void main(String[] args) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式System.out.pr

java中调用kettle转换文件

java中调用kettle转换文件 通过命令行也可以调用,然后java中调用命令行代码也可以:这样没有和java代码逻辑无缝集成.本文说明kettle5.1中如果通过其他API和java代码无缝集成:网上大多数资料都是低版本的,在kettle5.x中已经不能运行. 1.       需要哪些jar文件 以kettle开头的是必须,上图最下面三个也要:红色框中的两个是我测试转换用到的,分别是生成UUID和文件. 要是少了jar文件,运行程序一定报错,大家根据错误到kettle安装目录LIB中找相应

在java中调用python方法

1.http://sourceforge.net/projects/jython/下载jython包,把其中的jython.jar添加到工程目录 示例: 1.摘自:http://blog.csdn.net/anbo724/article/details/6608632 1.在java类中直接执行python语句 import javax.script.*; import org.python.util.PythonInterpreter; import java.io.*; import sta

oracle pl/sql之在java中调用带有输入输出参数的oracle存储过程

只需注意一点输出参数是用CallableStatement里面的registerOutParameter方法注册进去 存储过程: import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Types; //在java中

Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V at Test.testPrint(Native Method) at Test.main(Test.java:8) 解决方法: 昨天一天都在想办法解决这个问题,操作步骤按照教程来的,怎么会出错呢?想了半天,觉得还是dll文件生成的不对.所以,最后决定把codeblocks换成visual

oracle pl/sql之在java中调用无参的oracle存储过程

在java 中调用oracle的存储过程和jdbc的操作类似都是分以下几个步骤 1:加载驱动 2:链接数据库并获得一个数据库链接对象 3:执行语句 4:操作结果集 5:关闭资源 前提是:存储过程已写好 create or replace procedure my_procedure is begin insert into emp(empno,ename) values(9527,'唐伯虎'); end; java程序演示: import java.sql.CallableStatement;i