java如何同系统剪切板进行交换? 交换内容为图文混排,如从网页、word文件中拷贝一段图像、字符混合内容到java程序中,或从java程序中拷贝一段图像、字符混合内容到word中? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 嗯,通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用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 肯定可以实现的实现一个类包装你的图像和文字实现你自己的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里选择文字和图片后,也一样的实现(没试过) core java volumn2 里就有关于你想要得 看书。 书上有。 属于AWT部分。 求帮忙写程序 JAVA 编程的问题 求〈深入JAVA虚拟机2〉随书光盘 怎么把TXT文件的数据读出来? 求高手发个新手常见JAVA基础编程常见问题,本人英语很差总不明白编译时那些问题出在那!!! 一个小问题,希望高手指教 请问线程的wait()和notify()具体是个什么用法??? java.awt.*与javax.swing.*的区别啊 我是编译通过了,但是运行时却有这样的错误,怎么回事啊? 数组合并 树型结构刷新后怎么还是变成原来的 js如何获取sql2000中的数据表中的数据
通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用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;
} }
实现一个类包装你的图像和文字
实现你自己的Transferable类
在Transferable类的getTransferData(DataFlavor)里返回你的类
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里选择文字和图片后,也一样的实现(没试过)