java如何同系统剪切板进行交换?

java如何同系统剪切板进行交换?

<script language="javascript" src="/AD/ad_juxing_up.js" type="text/javascript"></script>

 

原文位置:http://www.it130.cn/Article/FAQ/Java-jishu/GUI-sheji/2007-2-1/2007020114392640.html

 

所属分类:Java GUI 设计
----------------------------------------------------------------------

交换内容为图文混排,如从网页、word文件中拷贝一段图像、字符混合内容到java程序中,或从java程序中拷贝一段图像、字符混合内容到word中?

----------------------------------------------------------------------

嗯,
通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。 

Java中使用java.awt.datatransfer.Clipboard类来描述剪切板,并把剪切板分为两种类型:本地和系统,本地剪切板使用 Clipborad cp = new Clipboard("clip1"); 来构造;系统剪切板通过 

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

获取,下面我们给出几个常用的方法用于读写剪切板中的文本数据以及图像数据 

1. 从指定的剪切板中获取文本内容 
protected static String getClipboardText(Clipboard clip) throws Exception{ 
// 获取剪切板中的内容 
Transferable clipT = clip.getContents(null); 
if (clipT != null) { 
// 检查内容是否是文本类型 
if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor)) 
return (String)clipT.getTransferData(DataFlavor.stringFlavor); 

return null; 



2. 往剪切板写文本数据 
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. 写图像到剪切板 

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); 



有了这四个方法,你下面可以自己写一些程序来进行测试,利用它来实现与其他程序结合测试对剪切板数据的操作。这里给出一个用于显示图像的类,只要把Image实例作为参数传入即可。 

/* 
* 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; 

/** 
* 显示一个图像 
* @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); 

}); 
//窗口适应图像大小 
setSize(image.getWidth(null), image.getHeight(null)); 
//窗口标题 
setTitle("Viewing Image from Clipboard"); 
setVisible(true); 


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


/** 
* 用于读取图像文件并生成Image对象 
*/ 
public static Image getImageFromFile(String fileName) { 
Toolkit toolkit = Toolkit.getDefaultToolkit(); 
Image image = toolkit.getImage(fileName); 
return image; 





--------------------------------------------------------

http://choubenben.spaces.live.com/blog/cns!7FF3B41D06059194!196.entry?_c11_blogpart_blogpart=blogview&_c=blogpart

--------------------------------------------------------

我想解决的是文本与图像同时拷贝和粘贴,系统剪切板包含文本与图像两种格式,能实现么,请大家帮忙!

--------------------------------------------------------

没人帮忙,自己顶上来

--------------------------------------------------------

期待中.....


--------------------------------------------------------

帮忙.........

--------------------------------------------------------

很奇怪的需求。。。

--------------------------------------------------------

mark

--------------------------------------------------------

肯定可以实现的
实现一个类包装你的图像和文字
实现你自己的Transferable类
在Transferable类的getTransferData(DataFlavor)里返回你的类

--------------------------------------------------------

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
import java.io.*;
class ClipboardTest2 
{
JFrame mainFrame;
JPanel mainPanel;
JButton button;
Clipboard cb;
public ClipboardTest2() {
mainFrame = new JFrame (  );
mainPanel = new JPanel ();
button = new JButton ("Button");
button.setIcon( new ImageIcon("candle.png") );

cb = Toolkit.getDefaultToolkit().getSystemClipboard();
button.addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent e){
ButtonTextAndImageTransferable btait =
new ButtonTextAndImageTransferable(button);
cb.setContents( btait,btait );
}
});

mainPanel.add( button );
mainFrame.getContentPane().add( mainPanel );
mainFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
mainFrame.pack();
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible( true );
}
public static void main(String[] args) 
{
SwingUtilities.invokeLater( new Runnable(){
public void run(){
new ClipboardTest2();
}
});
}
}
class ButtonTextAndImageTransferable extends ImageIcon implements Transferable,ClipboardOwner{
DataFlavor[] flavors;
JButton button;
public void lostOwnership(Clipboard clipboard, Transferable contents){
System.out.println( "lostownership" );
}
public ButtonTextAndImageTransferable( JButton button){
    flavors = new DataFlavor[2];
flavors[0] =  DataFlavor.stringFlavor;
flavors[1] =  DataFlavor.imageFlavor;
this.button = button ;
}
public DataFlavor[] getTransferDataFlavors(){
return flavors;
}
public Object getTransferData(DataFlavor flavor){
if( flavor.equals( flavors[0] ) )
{
return button.getText();
}else{
if( flavor.equals( flavors[1] ) ){
ImageIcon icon = (ImageIcon)button.getIcon();
return icon.getImage();
}
}
return null;
}
public boolean isDataFlavorSupported(DataFlavor flavor){
if( flavor.equals( flavors[0] ) ||
flavor.equals( flavors[1] ))
return true;
return false;
}
}
=============================================
按下按钮,按钮的文字和图片就复制到了剪贴板(因为java只支持jpg,gif,png,格式,所以对其他格式就没办法了)

然后在word里先菜单编辑-选择性粘贴就行了
=========================
直接选粘贴是不行的.即便是word,同时选择了文字和图片,也没有办法在另外的程序(例如写字板)里直接粘贴
=======================
反过来,在word里选择文字和图片后,也一样的实现(没试过) 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值