2015年7月15日 星期三

Java Swing的DnD (Drag and Drop)

Drag and Drop (DnD) 就是中文的拖放,例如我們平常在Windows下常常會用滑鼠直接將檔案從一個資料夾移到另一個資料夾、或是將影片檔直接移到播放器的介面上以播放影片,這些動作就是所謂的DnD,而在Java Swing裡也提供了DnD的實作功能。

在這篇文章中,我們要演示一個簡單的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();
                }
            }
        });
    }

最後試試看結果:

  1. 如果拖曳的是一般檔案,即可在JTextArea中顯示檔案列表,如下所示:


  2.  如果拖曳的是不可轉成檔案列表格式的物件,則在JTextArea中會顯示錯誤訊息:


最後附上源始碼下載:
DnDTest.7z

參考資料:

  1. How to drag and drop with Java 2
  2. Java中的Drag and Drop詳解與代碼示例
  3. java swing中實現拖拽功能示例_java

沒有留言 :

張貼留言