2011-10-20 73 views
4

我正在製作一個使用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); 

setContants後剪貼板是空的;任何想法爲什麼,以及如何解決它?

回答

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

的DataHandler不會在你規定的方式運行,因爲根據API:

DataHandler實現Transferable接口以便數據可用於AWT數據傳輸操作,如剪切和粘貼以及拖放操作。 Transferable接口的實現依賴於已安裝的DataContentHandler對象的可用性,該對象對應於DataHandler特定實例中表示的數據的MIME類型。

我明白這意味着,除非你使用它的方法setDataContentHandlerFactory和實施所有必需的接口內,從本質上講,DataHandler的只會返回null。這可能是DataHandler無法按預期運行的原因。儘管它實現了Transferable接口,但它並沒有以適合您的特殊需求的方式實現它。
此功能將由DataContentHandler給出,其實施將由您決定。

如前面所建議的那樣,直接實施Transferable類似乎並不那麼繁瑣。

相關問題