11.10.2 拖放源
11.10.2 拖放源
前面程序使用DropTarget创建了一个拖放目标,直接使用系统资源管理器作为拖放源。下面介绍如何在Java程序中创建拖放源,创建拖放源比创建拖放目标要复杂一些,因为程序需要把被拖放内容封装成Transferable对象。
创建拖放源的步骤如下。
1、调用DragSource的getDefaultDragSourceO方法获得与平台关联的DragSource对象。
2、调用DragSource对象的createDefaultDragGestureRecognizer(Component c,int actions.DragGestureListener dgl)方法将指定组件转换成拖放源。其中actions用于指定该拖放源可接受哪些拖放操作,而dgl是一个拖放监听器,该监听器里只有一个方法:dragGestureRecognized(),当系统检测到用户开始拖放时将会触发该方法。
如下代码将会把一个JLabel对象转换为拖放源。
1 | // 将srcLabel组件转换为拖放源 |
3、 为第2步中的DragGestureListener监听器提供实现类,该实现类需要重写该接口里包含的dragGestureRecognized()方法,该方法负责把拖放内容封装成Transferable对象。
下面程序示范了如何把一个JLabel转换成拖放源。
import java.awt.*; import java.awt.dnd.*; import java.awt.datatransfer.*; import javax.swing.*; public class DragSourceTest { JFrame jf = new JFrame("Swing的拖放支持"); JLabel srcLabel = new JLabel("Swing的拖放支持.\n" +"将该文本域的内容拖入其他程序.\n"); public void init() { DragSource dragSource = DragSource.getDefaultDragSource(); // 将srcLabel转换成拖放源,它能接受复制、移动两种操作 dragSource.createDefaultDragGestureRecognizer(srcLabel , DnDConstants.ACTION_COPY_OR_MOVE , event -> { // 将JLabel里的文本信息包装成Transferable对象 String txt = srcLabel.getText(); Transferable transferable = new StringSelection(txt); // 继续拖放操作,拖放过程中使用手状光标 event.startDrag(Cursor.getPredefinedCursor(Cursor .HAND_CURSOR), transferable); }); jf.add(new JScrollPane(srcLabel)); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new DragSourceTest().init(); } }
上面程序中粗体字代码负责把一个JLabel组件创建成拖放源,创建拖放源时指定了一个DragGestureListener对象,该对象的dragGestureRecognized)方法负责将JLabel上的文本转换成Transferable对象后继续拖放。
运行上面程序后,可以把程序窗口中JLabel标签的内容直接拖到Eclipse编辑窗口中,或者直接拖到EditPlus编辑窗口中。
除此之外,如果程序希望能精确监听光标在拖放源上的每个细节,则可以调用DragGestureEvent对象的startDrag(Cursor dragCursor,Transferable transferable,DragSourceListener dsl)方法来继续拖放操作。该方法需要一个DragSourceListener监听器对象,该监听器对象里提供了如下几个方法。
- dragDropEnd(DragSourceDropEvent dsde):当拖放操作已经完成时将会触发该方法。
- dragEnter(DragSourceDragEvent dsde):当光标进入拖放源组件时将会触发该方法。
- dragExit(DragSourceEvent dse):当光标离开拖放源组件时将会触发该方法。
- dragOver(DragSourceDragEvent dsde):当光标在拖放源组件上移动时将会触发该方法。
- dropActionChanged(DragSourceDragEvent dsde):当用户在拖放源组件上改变了拖放操作,例如按下或松开Ctrl等辅助键时将会触发该方法。
掌握了开发拖放源、拖放目标的方法之后,如果接下来在同一个应用程序中既包括拖放源,也包括拖放目标,这样即可在同一个Java程序的不同组件之间相互拖动内容。