Java实现鼠标拖放功能的方法(2)
1.新建一个Project,取名为JDragAndDropDemo。
2.新建一个Application,取名为JDragAndDropDemo;主窗口取名为MainFrame,标题为JDragAndDropDemo。
3.新建一个Class,取名为DragJLabel,继承JLabel 类。
4.利用wizards|implements interface 使DragJLabel 类实现DragGestureListener 、DragSourceListener 接口。
5.在类DragJLabel 中添加新的属性 DragSource ds,代码如下:
class DragJLabel extends JLabel implements DragGestureListener, DragSourceListener { DragSource ds = DragSource.getDefaultDragSource(); //创建DragSource 实例 …… }
6.编写DragJLabel 类的构造方法。
public DragJLabel(String title,int alignment){ super(title,alignment); //使用父类的方法 int action = DnDConstants.ACTION_COPY_OR_MOVE; ds.createDefaultDragGestureRecognizer(this,action,this); //创建 }
7.实现DragJLabel 类中的dragGestureRecognized()方法,包装并发送数据。
public void dragGestureRecognized(DragGestureEvent dge) { //throw new java.lang.UnsupportedOperationException("Method dragGestureRecognized() not yet implemented."); try{ Transferable tr = new StringSelection(this.getText()); dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this); }catch(Exception err){ err.printStackTrace(); } }
8.实现DragJLabel 类中的dragEnter()方法,设置光标的形状。
public void dragEnter(DragSourceDragEvent dsde) { //throw new java.lang.UnsupportedOperationException("Method dragEnter() not yet implemented."); DragSourceContext dsc = dsde.getDragSourceContext(); int action = dsde.getDropAction(); if ((action&DnDConstants.ACTION_COPY)!=0) dsc.setCursor(DragSource.DefaultCopyDrop); else dsc.setCursor(DragSource.DefaultCopyNoDrop); }
9.在MainFrame 类的设计窗口中下部添加一个JTextField 组件,并在类中创建一个DragJLabel实例,具体代码如下:
public class MainFrame extends JFrame implements DropTargetListener { private JPanel contentPane; private BorderLayout borderLayout1 = new BorderLayout(); private JTextField jTextField1 = new JTextField(); DragJLabel label = new DragJLabel("Hello World !",SwingConstants.CENTER); …… }
10.编写MainFrame 类的初始化方法jbInit(),设置组件的初始属性,并创建一个新的DropTarget实例,代码如下:
private void jbInit() throws Exception { //setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]"))); contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(borderLayout1); this.setSize(new Dimension(410, 114)); this.setTitle("JDragAndDropDemo"); jTextField1.setFont(new java.awt.Font("Dialog", 0, 14)); contentPane.add(jTextField1, BorderLayout.SOUTH); contentPane.add(this.label,BorderLayout.NORTH); new DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this); }
11.利用wizards|implements interface 使MainFrame 类实现DropTargetListener 接口。
12.实现继承自DropTargetListener 接口的方法drop(),处理传递来的数据,具体代码如下:
public void drop(DropTargetDropEvent dtde) { //throw new java.lang.UnsupportedOperationException("Method drop() not yet implemented."); try{ Transferable tr = dtde.getTransferable(); if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){ dtde.acceptDrop(dtde.getDropAction()); String s = (String) tr.getTransferData(DataFlavor.stringFlavor); this.jTextField1.setText(this.jTextField1.getText()+s); dtde.dropComplete(true); }else{ dtde.rejectDrop(); } }catch(Exception err){ err.printStackTrace(); } }