在這篇文章中,我們要演示一個簡單的DnD實作,在主要Swing畫面上放置一個JTextArea,當我們在Windows下把一個或多個檔案用滑鼠圈選移到JTextArea後,JTextArea裡會顯示所移上去的檔案路徑列表。
程式非常簡單,首先我們可以建立一個Java Swing的專案(例如使用NetBeans),命名為 "DragAndDropTest"。並在上面放一個JTextArea,我們把它命名為 "dragAndDropJTextArea"。
接著在DragAndDropTest的建構子中加上如下程式碼即可:
public DragAndDropTest() {
//產生各元件
initComponents();
//為dragAndDropJTextArea設置DropTarget,其用來接收DropTargetDropEvent,
//可從DropTargetDropEvent取得Transferable物件,即被包裝的拖曳物件。
dragAndDropJTextArea.setDropTarget(new DropTarget() {
public synchronized void drop(DropTargetDropEvent evt) {
try {
//設置可接受的拖曳類型
//如果拖曳物件可支援檔案列表格式(javaFileListFlavor)
if (evt.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
//接受拖曳
evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
//得到Transferable物件,並將其轉成檔案列表格式(javaFileListFlavor),
//轉型成List<File>
List<File> droppedFiles = (List<File>) evt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
//清空dragAndDropJTestArea的內容
dragAndDropJTextArea.setText("");
//將拖曳的檔案以檔案列表的方式顯示在dragAndDropJTestArea中
//字顏色為黑色
dragAndDropJTextArea.setForeground(Color.BLACK);
for (File file : droppedFiles) {
//顯示檔案列表
dragAndDropJTextArea.append(file.getPath() + "\n");
}
} else {
//若拖曳的物件不能支持檔案列表格式,
//拒絕Drop
evt.rejectDrop();
//顯示錯誤訊息,字顏色為紅色
dragAndDropJTextArea.setText("錯誤:拖曳類型不支援檔案列表格式!");
dragAndDropJTextArea.setForeground(Color.red);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
最後試試看結果:
- 如果拖曳的是一般檔案,即可在JTextArea中顯示檔案列表,如下所示:
- 如果拖曳的是不可轉成檔案列表格式的物件,則在JTextArea中會顯示錯誤訊息:
最後附上源始碼下載:
DnDTest.7z
參考資料:


沒有留言 :
張貼留言