Установка изображений в буфер обмена - Java - PullRequest
4 голосов
/ 20 октября 2011

Я делаю программу с использованием 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 ]

8 голосов
/ 20 октября 2011

Вот некоторый код, который я использовал для записи / чтения изображения из буфера обмена. Никогда не пробовал с сокетами, поэтому я не уверен, что это поможет:

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);
    }
}
0 голосов
/ 05 января 2013

DataHandler не будет работать так, как вы прописали, потому что согласно API:

DataHandler реализует интерфейс Transferable, так что данные могут использоваться в операциях передачи данных AWT, таких как вырезание ивставьте и перетащите.Реализация интерфейса Transferable зависит от доступности установленного объекта DataContentHandler, соответствующего типу MIME данных, представленных в конкретном экземпляре DataHandler.

Я понимаю, что это означает, что если вы не используетеего метод setDataContentHandlerFactory и реализация всех необходимых интерфейсов, по сути, DataHandler просто вернет ноль.Вероятно, это причина того, что DataHandler не работает так, как вы ожидаете.Даже несмотря на то, что он реализует интерфейс Transferable, он не реализует его так, чтобы он функционировал адекватно вашим конкретным потребностям.
Эта функциональность была бы предоставлена ​​DataContentHandler, реализация которого была бы оставлена ​​на ваше усмотрение.

Кажется, менее утомительно напрямую реализовывать класс Transferable, как предлагалось ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...