我正在使用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之后,剪贴板为空;任何想法,以及如何解决它?
答案 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类似乎不那么繁琐。