将图像设置为剪贴板 - Java

时间:2011-10-20 10:45:08

标签: java clipboard

我正在使用java创建一个程序,通过套接字发送剪贴板内容;我设法使用字符串,但我遇到了一些图像问题。这是代码:

    //get Image
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    Image imageContents = (Image)clipboard.getData(DataFlavor.imageFlavor);
    ImageIcon image = new ImageIcon(imageContents);

    //sent over sockets

    //set Image
    String mime = DataFlavor.imageFlavor.getMimeType();
    DataHandler contents = new DataHandler(image,mime);

    //set clipboard
    clipboard.setContents(contents, null);

在setContents之后,剪贴板为空;任何想法,以及如何解决它?

2 个答案:

答案 0 :(得分:8)

以下是我用来从剪贴板写入/读取图像的一些代码。从未尝试使用套接字,所以我不确定它会有所帮助:

import java.awt.*;
import java.awt.datatransfer.*;

public class ClipboardImage
{
    /**
     *  Retrieve an image from the system clipboard.
     *
     *  @return the image from the clipboard or null if no image is found
     */
    public static Image read()
    {
        Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents( null );

        try
        {
            if (t != null && t.isDataFlavorSupported(DataFlavor.imageFlavor))
            {
                Image image = (Image)t.getTransferData(DataFlavor.imageFlavor);
                return image;
            }
        }
        catch (Exception e) {}

        return null;
    }

    /**
     *  Place an image on the system clipboard.
     *
     *  @param  image - the image to be added to the system clipboard
     */
    public static void write(Image image)
    {
        if (image == null)
            throw new IllegalArgumentException ("Image can't be null");

        ImageTransferable transferable = new ImageTransferable( image );
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
    }

    static class ImageTransferable implements Transferable
    {
        private Image image;

        public ImageTransferable (Image image)
        {
            this.image = image;
        }

        public Object getTransferData(DataFlavor flavor)
            throws UnsupportedFlavorException
        {
            if (isDataFlavorSupported(flavor))
            {
                return image;
            }
            else
            {
                throw new UnsupportedFlavorException(flavor);
            }
        }

        public boolean isDataFlavorSupported (DataFlavor flavor)
        {
            return flavor == DataFlavor.imageFlavor;
        }

        public DataFlavor[] getTransferDataFlavors ()
        {
            return new DataFlavor[] { DataFlavor.imageFlavor };
        }
    }

    public static void main(String[] args)
    {
        Image image = Toolkit.getDefaultToolkit ().createImage("???.jpg");
        ClipboardImage.write( image );

        javax.swing.ImageIcon icon = new javax.swing.ImageIcon( ClipboardImage.read() );
        javax.swing.JLabel label = new javax.swing.JLabel( icon );

        javax.swing.JFrame frame = new javax.swing.JFrame();
        frame.setDefaultCloseOperation( javax.swing.JFrame.EXIT_ON_CLOSE );
        frame.getContentPane().add( label );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

答案 1 :(得分:0)

DataHandler将无法按照您的规定运行,因为根据API:

  

DataHandler实现Transferable接口,以便可以在AWT数据传输操作中使用数据,例如剪切和粘贴以及拖放。 Transferable接口的实现依赖于已安装的DataContentHandler对象的可用性,该对象对应于DataHandler的特定实例中表示的数据的MIME类型。

我理解这意味着除非你使用它的setDataContentHandlerFactory方法并在其中实现所有必需的接口,否则DataHandler将只返回null。这可能是DataHandler无法按预期运行的原因。即使它实现了Transferable接口,它也不会以适合您特定需求的方式实现它。
此功能将由DataContentHandler提供,其实现将由您自己完成。

如前所述,直接实现Transferable类似乎不那么繁琐。