2011-11-03 89 views
1

我想實現JTextPane來編輯文本,使用從我的系統拖放到JTextPane的圖像。我試圖通過使用JTextPane作爲超類和DropTargetListener作爲接口來實現它。但是當我試圖讀取我的InputStream時,我得到了一個NullPointerException。請幫忙。將圖像從文件夾拖放到JTextPane

import java.awt.datatransfer.*; 
import java.awt.dnd.*; 
import java.io.*; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JTextPane; 

public class JTextTest extends JTextPane implements DropTargetListener { 

private static final long serialVersionUID = 1L; 

public JTextTest() { 
    new DropTarget(this, this); 
    this.setDragEnabled(true); 
} 

@Override 
public void dragEnter(DropTargetDragEvent arg0) { 
} 

@Override 
public void dragExit(DropTargetEvent arg0) { 
} 

@Override 
public void dragOver(DropTargetDragEvent arg0) { 
} 

@Override 
public void drop(DropTargetDropEvent dropTargetDropEvent) { 
    System.out.println("Drop event"); 
    Transferable transferable = dropTargetDropEvent.getTransferable(); 
    for (DataFlavor d : transferable.getTransferDataFlavors()) { 
     if (d.isRepresentationClassInputStream()) { 
      dropTargetDropEvent 
        .acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 
      try { 
       InputStream is = new BufferedInputStream(
         (InputStream) transferable.getTransferData(d)); 

       ImageIcon image = new ImageIcon(ImageIO.read(is)); 
       this.insertIcon(image); 
      } catch (UnsupportedFlavorException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } else { 
      dropTargetDropEvent.rejectDrop(); 
     } 
    } 
    dropTargetDropEvent.getDropTargetContext().dropComplete(true); 
} 

@Override 
public void dropActionChanged(DropTargetDragEvent arg0) { 
} 
} 

回答

1

在這個片段中試試吧,

ImageIcon image = new ImageIcon(ImageIO.read(createImageInputStream(is))); 

的ImageIO.read()預期的是FileImageInputStreamInputStreamURL並注意在處理圖像,大多數NullPointerException的被拋出時,有一個問題(更具體地說,讀取圖像返回null)與圖像,圖像源或從該源讀取。

+0

你的意思是ImageIO.createImageInputStream(is)? – Sebastian

+0

這項工作?請求者請更新? –