在 Java 上就是透過 DnD 的方法來實作。
根據 [3] 的官方文件教學,DnD 分成兩個部分:
1、Drag and drop (DnD) support
2、Clipboard transfer through cut or copy and paste
文件中有提到只有某些 Component 有支援 DnD 的事件。
要註冊 DnD 事件,用法好像有好幾種?我目前試出來的方法是用 DropTargetListener
以下是初始化 DropTargetListener 的範例:
private DropTargetListener panelDropOutListener = new DropTargetListener() { @Override public void drop(DropTargetDropEvent dtde) { try { Transferable tf = dtde.getTransferable(); // The dragged thing is a file list. if(tf.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { // Accept the drop event and get the dropped information. int action = dtde.getDropAction(); dtde.acceptDrop(action); // Get the dropped information. List<?> list = (List<?>) tf.getTransferData(DataFlavor.javaFileListFlavor); for (Object o : list) { System.out.println("file=" + o); } } } catch (Exception e) { e.printStackTrace(); } } @Override public void dropActionChanged(DropTargetDragEvent dtde) {} @Override public void dragOver(DropTargetDragEvent dtde) {} @Override public void dragExit(DropTargetEvent dte) {} @Override public void dragEnter(DropTargetDragEvent dtde) {} };
其中可以看到 Drag & Drop 有分成好幾種事件:
- dragEnter:滑鼠拖曳著某個東西進入區域。
- dragExit:滑鼠拖曳著某個東西離開區域。
- dragOver:滑鼠拖曳著某個東西在區域內。(當滑鼠正在區域內時,這個事件會一直不斷觸發)
- dropActionChanged:字面上是滑鼠放開某個東西的動作改變了,不過我還沒測試出是什麼動作會產生這個事件 XD
- drop:滑鼠拖曳著某個東西,並在區域內放開。
在 Drop 的事件中,用 DropTargetDropEvent.getTransferable() 取得 Drop 事件丟下的東西
接著檢查 Drop 下來的是什麼東西,這裡是只檢查是否為檔案列表(也就是拖曳檔案過去的狀況)
如果是檔案列表的話,則將 Drop 的資訊接受,然後把這些資訊轉成 List。
印出的資訊如下:
file=D:\test.txt以上可以看出拖曳檔案時,Drop 會帶上檔案的完整路徑。
另外如果沒有呼叫 DropTargetDropEvent.acceptDrop() 的話,會丟出以下的 Exception
表示因為沒有接收 Drop 的資訊,因此沒有東西可以處理。
java.awt.dnd.InvalidDnDOperationException: No drop current
接著假設我們用的是 JTextPane,以下是註冊 Drop 事件的範例:
public class MainPanel extends JFrame { private static final long serialVersionUID = 1L; private JTextPane mainPanel = null; public MainPanel () { this.initialPanel(); this.initialJFrame(); } /** * Initialize JFrame. */ private void initialJFrame () { this.add(this.mainPanel); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.setSize(200, 100); this.setAlwaysOnTop(true); this.setVisible(true); } /** * Initialize the panel in JFrame. */ private void initialPanel () { this.mainPanel = new JTextPane(); this.mainPanel.setEditable(false); try { // Initial drag & drop event. DropTarget target = new DropTarget(); target.setActive(true); target.addDropTargetListener(this.panelDropOutListener); // Add event of drag & drop to JTextPane. this.mainPanel.setDropTarget(target); } catch (TooManyListenersException e) {} } private DropTargetListener panelDropOutListener; // Ignore the initialization. }
參考資料:
1、請問如何在Applet上設計拖曳檔案上傳..
2、DnD drag files
3、The Java Tutorial:Introduction to DnD
沒有留言:
張貼留言