将图像设置为剪贴板 – Java

我正在使用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之后,剪贴板为空; 任何想法为什么,以及如何解决它?

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

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

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

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

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

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