首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
CSDN - 文档中心 - Java 阅读:2716   评论: 1    参与评论
标题   如何在Java应用程序中实现copy图像功能。     选择自 turbochen 的 Blog
关键字   swing,clipboard,datatransfer
出处  

用Java开发图形应用程序的朋友一定遇到过如何在程序中实现复制图像的功能。在jdk1.4以前,java本身就支持将程序中文字串复制给其它的非java应用程序使用,而将程序中的图像复制到非java应用程序简直难上加难。只到jdk1.4出来,这个问题才得以解决。


一般我们开发java application界面,主要用swing图形包。几乎所有的swing控件都是由JComponent继承而来的。如果我们要取得JComponent的图像,可以用以下方式:


 Rectangle rect = comp.getBounds();
 BufferedImage bufImage = new BufferedImage(rect.width,
           rect.height,
           BufferedImage.TYPE_INT_RGB);
 Graphics g = bufImage.getGraphics();
 g.translate(-rect.x, -rect.y);
 comp.paint(g);
这样的话,图像就保存到BufferedImage对象当中了。


现在来看如何将这个BufferedImage复制到系统clipboard中。要做复制功能,一般是继承TransferHandler类,实现Transferable接口, 这样你的复制内容才能传到系统clipboard,为此我们来写一个ImageSelection类:


/**
* <p>Copyright: Copyright (c) 2002</p>
 * @author Turbo Chen
 * @version 1.00
 */
import java.awt.*;
import java.awt.image.*;
import java.awt.datatransfer.*;
import javax.swing.*;


public class ImageSelection extends TransferHandler
       implements Transferable
{


  private static final DataFlavor flavors[] =
     {DataFlavor.imageFlavor};


  private Image image;


  public int getSourceActions(JComponent c) {
    return TransferHandler.COPY;
  }


  public boolean canImport(JComponent comp, DataFlavor
    flavor[]) {
    for (int i=0, n=flavor.length; i<n; i++) {
      if (flavor[i].equals(flavors[0])) {
        return true;
      }
    }
    return false;
  }


//将图像复制到Image对象.


  public Transferable createTransferable(JComponent
    comp) {
    // Clear clip
    image = null;
    Icon icon = null;
 Rectangle rect = comp.getBounds();
 BufferedImage bufImage = new BufferedImage(rect.width,
           rect.height,
           BufferedImage.TYPE_INT_RGB);
 Graphics g = bufImage.getGraphics();
  comp.paint(g);


    if (bufImage != null ) {
      image = bufImage;
      return this;
    }
    return null;
  }


  // Transferable
  public Object getTransferData(DataFlavor flavor) {
    if (isDataFlavorSupported(flavor)) {
      return image;
    }
    return null;
  }


  public DataFlavor[] getTransferDataFlavors() {
    return flavors;
  }


  public boolean isDataFlavorSupported(DataFlavor
    flavor) {
    return flavor.equals(flavors[0]);
  }
}


利用这个类,就可以轻松的将JComponent图像复制到系统clipboard了.怎么使用呢,再来看看下面的代码:


    final Clipboard clipboard =
      kit.getSystemClipboard();


    Icon icon = new ImageIcon("myphoto.jpg");
    final JLabel label = new JLabel(icon);
    label.setTransferHandler(new ImageSelection());


    JButton copy = new JButton("Label Copy");
    copy.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        TransferHandler handler =
          label.getTransferHandler();
        handler.exportToClipboard(label, clipboard,
          TransferHandler.COPY);
      }
    });


在你的程序中,要有一个JFrame, 加上一个JLabel,一个JButton,将上面的代码加进入,你就可以在你的程序中看到图像如何复制到系统clipboard了.


 


相关文章
对该文的评论
zhigangxie ( 2004-05-14)
注意到作者提供的第一段代码:
 Rectangle rect = comp.getBounds();
 BufferedImage bufImage = new BufferedImage(rect.width,
           rect.height,
           BufferedImage.TYPE_INT_RGB);
 Graphics g = bufImage.getGraphics();
 g.translate(-rect.x, -rect.y);
 comp.paint(g);

最后一行应该改为:
 comp.print(g);
将更加恰当。