【问题标题】:Setting images to Clipboard - Java将图像设置为剪贴板 - Java
【发布时间】:2013-01-05 04:59:56
【问题描述】:

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

【问题讨论】:

    标签: java clipboard


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      DataHandler 不会按照您规定的方式运行,因为根据 API:

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

      我理解这意味着除非您使用它的setDataContentHandlerFactory 方法并在其中实现所有必需的接口,否则DataHandler 将简单地返回null。这可能是 DataHandler 无法按预期运行的原因。尽管它实现了Transferable 接口,但它并没有以能够充分满足您的特定需求的方式实现它。
      此功能将由 DataContentHandler 提供,其实现由您决定。

      按照之前的建议直接实现 Transferable 类似乎没那么繁琐。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多