文档章节

JAVA中使用拖拽功能原理

jxlgzwh
 jxlgzwh
发布于 2012/08/19 22:00
字数 1293
阅读 286
收藏 1
在JAVA中使用拖拽功能
sun在java2中引入了一些新的方法来帮助实现拖拽功能,这些新的类在java.awt.dnd包中
实现一个D&D操作一般包括三个步骤:
 首先实现一个拖拽源,这个拖拽源和相应的组件是关联起来的
 第二步实现一个拖拽目标,这个目标用来实现拖拽物的接收
 第三步实现一个数据传输对象,该对象封装拖动的数据
  _____________________                                      _____________________
 |                     |                                     |                    |   
 | DragSource Component|                                     |DropTarget Component|
 |_____________________|                                     |____________________|
                   |                                              |
                   |____________Transferable Data_________________|
                   
 Transferable 接口实现出的对象能够保证  DropTarget Component读懂拖拽过来的对象中包含的信息
 如果是在同一个虚拟机中实现拖拽的话,DragSource Component会传递一个引用给DropTarget Component
 但是如果在不同的JVM中或者是在JVM和本地系统之间传递数据的话我们就必须实现一个Transferable对象来传递数据
 Transferable中封装的内容存放到DataFlavors,用户可以通过访问DataFlavors来获取数据
 1。创建可拖拽对象
   一个对象那个如果想作为拖拽源的话,必须和五个对象建立练习,这五个对象分别是:
    * java.awt.dnd.DragSource
    获取DragSource的方法很简单,直接调用DragSource.getDefaultDragSource();就可以得到DragSource对象
    * java.awt.dnd.DragGestureRecognizer
    DragGestureRecognizer类中实现了一些与平台无关的方法,我们如果想在自己的组件上实现拖拽的话只要调用createDefaultDragGestureRecognizer()方法就可以了
    该方法接收三个参数,建立组件和拖拽动作之间的关系
    * java.awt.dnd.DragGestureListener
    当建立了组件和拖拽动作之间的联系后,如果用户执行了拖拽操作,组件将发送一个消息给DragGestureListener监听器
    DragGestureListener监听器接下来会发送一个startDrag()消息给拖拽源对象,告诉组件应该执行拖拽的初始化操作了
    拖拽源会产生一个DragSourceContext对象来监听动作的状态,这个监听过程是通过监听本地方法DragSourceContextPeer来实现的
    * java.awt.datatransfer.Transferable
   
    * java.awt.dnd.DragSourceListener
    DragSourceListener接口负责当鼠标拖拽对象经过组件时的可视化处理, DragSourceListener接口的显示结果只是暂时改变组件的外观
    同时他提供一个feedback,当用户的拖拽操作完成之后会收到一个dragDropEnd的消息,我们可以在这个函数中执行相应的操作
    再来回顾一下拖拽源的建立过程
    首先、 DragGestureRecognizer 确认一个拖拽操作,同时告知 DragGestureListener.

    其次、 Assuming the actions and/or flavors are OK, DragGestureListener asks DragSource to startDrag().

    第三、 DragSource creates a DragSourceContext and a DragSourceContextPeer. The DragSourceContext adds itself as a DragSourceListener to the DragSourceContextPeer.

    第四、 DragSourceContextPeer receives state notifications (component entered/exited/is over) from the native system and delegates them to the DragSourceContext.

    第五、 The DragSourceContext notifies the DragSourceListener, which provides drag over feedback (if the DropTargetListener accepts the action). Typical feedback includes asking the DragSourceContext to change the cursor.

    最后、 When the drop is complete, the DragSourceListener receives a dragDropEnd notification message

2。创建droppable Component
   创建一个 droppable Component必须和下面两个对象发生关联  
    * java.awt.dnd.DropTarget
    DropTarget构造函数使DropTarget 和 DropTargetListener objects发生关联
    Droptarget对象提供 setComponent 和addDropTargetListener 两个方法
   
    * java.awt.dnd.DropTargetListener
    The DropTargetListener needs an association with the Component so that the Component can notify the DropTargetListener to display "drag under" effects during the operation. This listener, which can be conveniently created as an inner class, transfers the data when the drop occurs. Warning: The Component itself shouldn't be the listener, since this implies its availability for use as some other Component's listener.
 




下面的例子演示了一个从树中拖拽一个节点到文本域中

package appletandservlet;

import java.awt.*;

import javax.swing.*;
import com.borland.jbcl.layout.XYLayout;
import com.borland.jbcl.layout.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
import java.io.*;
import javax.swing.tree.*;

public class DragAndDrop extends JFrame {

    XYLayout xYLayout1 = new XYLayout();
    JScrollPane jScrollPane1 = new JScrollPane();
    JTextArea jTextArea1 = new JTextArea();

    public DragAndDrop() {
        try {
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        getContentPane().setLayout(xYLayout1);


        jScrollPane1.getViewport().setBackground(new Color(105, 38, 125));
        jTextArea1.setBackground(Color.orange);
        jTextArea1.setToolTipText("");
        JTree jtr = new JTree();
        jtr.setBackground(Color.BLUE);
        jScrollPane1.getViewport().add(jtr);
        this.getContentPane().add(jTextArea1,
                                  new XYConstraints(238, 42, 140, 248));
        this.getContentPane().add(jScrollPane1,
                                  new XYConstraints(16, 42, 217, 249));

        DragSource dragSource = DragSource.getDefaultDragSource(); //创建拖拽源
        dragSource.createDefaultDragGestureRecognizer(jtr,
                DnDConstants.ACTION_COPY_OR_MOVE,
                new DragAndDropDragGestureListener()); //建立拖拽源和事件的联系
      DropTarget dropTarget = new DropTarget(jTextArea1,
            new DragAndDropDropTargetListener());

    }

    private void jbInit() throws Exception {

    }

    public static void main(String[] args) {

        DragAndDrop dad = new DragAndDrop();
        dad.setTitle("拖拽演示");
        dad.setSize(400, 300);
        dad.setVisible(true);

    }
}


class DragAndDropDragGestureListener implements DragGestureListener {
    public void dragGestureRecognized(DragGestureEvent dge) {
        //将数据存储到Transferable中,然后通知组件开始调用startDrag()初始化
        JTree tree = (JTree) dge.getComponent();
      TreePath path = tree.getSelectionPath();
       if(path!=null){
           DefaultMutableTreeNode selection = (DefaultMutableTreeNode) path
            .getLastPathComponent();
           DragAndDropTransferable dragAndDropTransferable = new
                   DragAndDropTransferable(selection);
           dge.startDrag(DragSource.DefaultCopyDrop, dragAndDropTransferable, new DragAndDropDragSourceListener());
       }
    }


}


class DragAndDropTransferable implements Transferable {
    private DefaultMutableTreeNode treeNode;
    DragAndDropTransferable(DefaultMutableTreeNode treeNode) {
        this.treeNode = treeNode;
    }
    static DataFlavor flavors[] = {DataFlavor.stringFlavor};
    public DataFlavor[] getTransferDataFlavors() {
        return flavors;
    }

    public boolean isDataFlavorSupported(DataFlavor flavor) {
        if(treeNode.getChildCount()==0){
         return true;
        }
        return false;
    }

    public Object getTransferData(DataFlavor flavor) throws
            UnsupportedFlavorException, IOException {

      return treeNode;
   
    }


}


 class DragAndDropDragSourceListener implements DragSourceListener {
  public void dragDropEnd(DragSourceDropEvent dragSourceDropEvent) {
    if (dragSourceDropEvent.getDropSuccess()) {
        //拖拽动作结束的时候打印出移动节点的字符串
      int dropAction = dragSourceDropEvent.getDropAction();
      if (dropAction == DnDConstants.ACTION_MOVE) {
        System.out.println("MOVE: remove node");
      }
    }
  }

  public void dragEnter(DragSourceDragEvent dragSourceDragEvent) {
    DragSourceContext context = dragSourceDragEvent
        .getDragSourceContext();
    int dropAction = dragSourceDragEvent.getDropAction();
    if ((dropAction & DnDConstants.ACTION_COPY) != 0) {
      context.setCursor(DragSource.DefaultCopyDrop);
    } else if ((dropAction & DnDConstants.ACTION_MOVE) != 0) {
      context.setCursor(DragSource.DefaultMoveDrop);
    } else {
      context.setCursor(DragSource.DefaultCopyNoDrop);
    }
  }

  public void dragExit(DragSourceEvent dragSourceEvent) {
  }

  public void dragOver(DragSourceDragEvent dragSourceDragEvent) {
  }

  public void dropActionChanged(DragSourceDragEvent dragSourceDragEvent) {
  }
}
class DragAndDropDropTargetListener implements DropTargetListener{
    public void dragEnter(DropTargetDragEvent dtde){
   
    }
    public void dragOver(DropTargetDragEvent dtde){
    }
    public void dropActionChanged(DropTargetDragEvent dtde){
    }
    public void dragExit(DropTargetEvent dte){
    }
    public void drop(DropTargetDropEvent dtde){
       Transferable tr=dtde.getTransferable();//使用该函数从Transferable对象中获取有用的数据
       String s="";
        try {
            if(tr.isDataFlavorSupported(DataFlavor.stringFlavor)){
                s = tr.getTransferData(DataFlavor.stringFlavor).toString();
            }
        } catch (IOException ex) {
        } catch (UnsupportedFlavorException ex) {
        }
        System.out.println(s);
        DropTarget c=(DropTarget)dtde.getSource();
        JTextArea d=(JTextArea)c.getComponent();
        if(s!=null&&s!=""){
            d.append(s + "\n");
        }
    }


}

本文转载自:http://www.blogjava.net/yglwxl/archive/2008/01/10/174278.html

jxlgzwh
粉丝 56
博文 343
码字总数 164180
作品 1
深圳
程序员
私信 提问
Java报表比较之中国式报表(复杂报表)篇

Java报表工具,首先可以分成两大类:纯Java报表工具,和支持Java的报表工具。 支持Java的报表工具 我们所说的”支持”Java的报表工具.其实就是非Java的报表工具,但是可以在Java程序中调用....

敏捷商业智能
2012/08/01
722
2
Visual Studio Code 1.36 发布,结束对 Linux 32 位系统的支持

Visual Studio Code 六月份更新之 1.36 已发布。 先看看有哪些更新亮点: 隐藏/显示状态栏项目 - 在状态栏只展示你选择的项目 优化文件资源管理器中的缩进结构 - 清晰地高亮显示项目的文件夹...

局长
07/05
12.4K
30
eclipse的IDE拖拽开发WEB开发指南

html5的canvas可以对元素进行截图,我的个XX啊这么牛逼的吗?事实证明我确实是个啥子,去成都参加一个外包增援项目的时候有这个需求,要求报表转pdf,于是就接触到了这个技术,然后我看到了,...

快速开发师
2018/08/28
637
1
天宫二号成功了,我也完成了从web平台到eclipse的编辑器对接,极大地提高了性能

我14个月之前设计了一个拖拽平台网页版,网页代码编辑器(Codemirror)笨重消耗了大量浏览器内存,目前仅能支持html css等几种语言,且操作不流畅缓慢,显然不够敏捷,有时候还出现代码刷白,...

快速开发师
2016/09/17
606
0
java 编写的拖拽程序,支持截屏

java编写,在IE浏览器,或谷歌浏览器等浏览器上,拖拽网页到自己写的程序,程序可显示网页的URL,标题。如果拖拽网页上的文字,还可显示其文本, 另有支持截屏功能。只好给一个例子。谢谢! eM...

zmh
2011/08/25
480
3

没有更多内容

加载失败,请刷新页面

加载更多

linux 磁盘不足异常

linux 报 No space left on device 异常 ,则是磁盘不足 ,导致异常 运行 df -h 命令查询磁盘使用率,如果有100%,则查找目录大日志文件删除 1.磁盘不足导致系统应用写入文件失败,如系统日志...

zaolonglei
26分钟前
3
0
即学即用的 30 段 Python 实用代码

☞ 分享:最全最新的Python学习大礼包 ☜ 点击查看 编译:Pita & AI开发者,作者:Fatos Morina Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许...

Object_Man
26分钟前
3
0
The server time zone value 'EDT' is unrecognized or represents more than one time zone.

2019-10-14 18:07:43.714 ERROR 74363 --- [Druid-ConnectionPool-Create-1855026648] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://10.30......

yizhichao
40分钟前
8
0
html加载顺序以及影响页面二次渲染额的因素

本文转载于:专业的前端网站➱html加载顺序以及影响页面二次渲染额的因素 浏览器请求发往服务器以后,返回HTML页面,页面内容开始渲染,具体的执行顺序为: 1. 浏览器开始载入html代码,发现<...

前端老手
42分钟前
9
0
BeginnersBook JSP、JSTL、Servlet 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
54分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部