java实现鼠标拖放功能代码实例

利用鼠标的拖放来交换程序的数据,即所谓的鼠标拖放功能。鼠标的拖放功能在图形化系统中非常常用,Java 提供了java.awt.dnd 和java.awt.datatransfer 包来支持该功能。本例将演示如何在程序中实现拖放,当在窗口上部的“Hello World!”标签点下鼠标,并拖至窗口下部的文本框放开,则在文本框中将添加“Hello World !”文本;继续上述过程,将继续添加该文本。

具体的实现思路和方法:在鼠标拖放的实现中,两个最重要的概念是拖拽源和放置目标,即drag source 和drop target。拖拽源和放置目标都是与可视化的组件相关联的(如果不可视,还怎么拖呢?!)。拖放技术的实质就是将拖拽源组件上的数据传递到放置目标组件上,因此从底层看,拖放和上例中的剪贴板技术很接近。

拖拽源的实现:拖拽源类必须先创建一个DragGestureRecognizer 实例,表明该类是拖拽源组件类或包含拖拽源组件。可以通过调用DataSource 对象的createDefaultDragGestureRecognizer方法实现。具体的实现如下:

int action = DnDConstants.ACTION_COPY_OR_MOVE; //拖放的类型

ds.createDefaultDragGestureRecognizer(this,action,this);

上面的语句表明, 拖拽源组件是本类自身的实例对象, 要完成的拖放的种类是DnDConstants.ACTION_COPY_OR_MOVE 型的,实现DragGestureListener 接口的类是本类。拖拽源一般实现DragGestureListener 接口,该接口中定义了一个dragGestureRecognized方法,当开始拖拽是,DragGestureListener 监听到事件,随即转入dragGestureRecognized()方法处理事件,如将拖拽源的数据发送出去。具体代码:

public void dragGestureRecognized(DragGestureEvent dge) {

//throw new java.lang.UnsupportedOperationException("Method dragGestureRecognized not yet implemented.");

try{

Transferable tr = new StringSelection(this.getText); //将标签的文本作为数据,由Transferable 对象包装

//开始拖拽,设置光标为DragSource.DefaultCopyNoDrop 形,拖放的数据是tr 对象,DragSourceListener 是本类

dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);

}catch(Exception err){

err.printStackTrace;

}

}

拖拽源还得实现DragSourceListener 接口,该接口定义了拖拽相关的各状态的事件处理方法。如dragEnter、dragOver、dropActionChanged、dragExit 等方法。本例中,将实现dragEnter()方法来设置拖拽时的光标形状,其他的方法为空方法。具体实现如下:

public void dragEnter(DragSourceDragEvent dsde) {

//throw new java.lang.UnsupportedOperationException("Method dragEnternot 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);

}

放置目标的实现:放置目标的类中必须先创建一个DragTarget 实例,来表明本类是放置目标组件类或包含放置目标组件,实现如下:

new DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);

上面的语句表明, 放置目标是this.jTextField1 对象, 拖放操作是DnDConstants.ACTION_COPY_OR_MOVE 型的,而实现DropTargETListener 接口的类是本类。与DrafSourceListener 相对应,放置目标或其所在类一般实现DropTargetListener 接口。该接口也定义了很多的方法,如dragEnter、dragOver 等,用于处理当拖放过程进入不同阶段时的事件。本例只关心drop方法,即当在放置目标组件上放开鼠标时的事件处理,一般用来处理传递到的数据,如本例中将在JTextField 组件上显示传递来的文本数据,其他方法为空方法,具体代码如下:

public void drop(DropTargetDropEvent dtde) {

//throw new java.lang.UnsupportedOperationException("Method dropnot 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;

}

}

程序代码:

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();}}

Java拖拽控件数据库_java实现鼠标拖放功能代码实例相关推荐

  1. winform窗体自由拖拽控件

    源码地址:https://download.csdn.net/download/horseroll/10906640 以上链接是用积分下载的,如果没有积分,可以用以下链接付费下载:https://do ...

  2. Silverlight 游戏开发:可重用的拖拽控件

    游戏中有各种各样的拖拽需求,大到窗口,小到图标,在游戏界面操作中,点击和拖拽占据了用户操作的大部分行为,如何做好一个拖拽控件至关重要,做一个可重用的拖拽控件更加重要,我的这些实现方法可能比较另类,但只 ...

  3. .net中实现拖拽控件

    在.net中实现拖拽控件主要用到以下函数: MouseDown(object sender, MouseEventArgs e) MouseUp(object sender, MouseEventAr ...

  4. Flutter拖拽控件Draggable

    Draggable 最近做了一个Flutter项目,其中有一个需求是做出三个可以互相拖拽的任务列表,平时在做Android项目时,拖动的控件基本上都是自定义View来实现的,想看看在Fluter上大家 ...

  5. js 拖拽生成html,js拖拽插件 js 拖拽控件生成自定义表单 怎么实现

    想请教一个js的问题,拖拽控件 js 拖拽控件生成自定义表单 怎么实现 说说步骤吧 监听mousedown事件 - 获取鼠标点击元素,判断是否可拖拽 - 设置flag做标记 - 建一个tempDOM, ...

  6. vue拖拽控件生成界面代码_Blue HMI人机界面开发平台

          随着信息技术在军工.制造业等领域的不断普及和快速发展,各行业信息系统软件的研制正在由传统的重复.烟囱式开发模式向以系统顶层设计为指导,以标准化.组件化.集成化软件开发为重点的模式逐步转变. ...

  7. H5实现多图片预览上传,可点击可拖拽控件介绍

    在做图片上传时发现一个蛮好用的控件,支持多张图片同时上传,可以点击选择图片,也可以将图片拖拽到上传框直接上传,方便,好用,接口也简单,基本可以直接放到项目里使用. 先看看他的样式: 选择图片后: $( ...

  8. C# Winform平台下实现自由拖拽控件

    C#控件拖动 1.场景需求 有时候,我们在编写PC上位机软件的时候,不免需要将所定义的控件可以自由的拖拽到任意地方.为了实现此一需求,我尝试了很多种方法,比如使用Mouse_Leave,Mouse_D ...

  9. Android 拖拽控件交换位置

    距离上次写博客已快有一月,中间也动过几次写博客的心思,但却因为懒,耽搁了下来.                         --萧洛 在网上搜寻了许久,实在是没有找到可用的demo,无奈只好自己写 ...

最新文章

  1. 2022-2028年中国客厅经济深度调研及投资前景预测报告
  2. 换掉 Maven,我用它!!!
  3. 当你用Python爬取网站遇到反爬,你应该这样做,轻松解决反爬问题
  4. 做网络推广时网站结构要如何进行优化呢?
  5. js 中对象--对象结构(原型链基础解析)
  6. java nio 追加写文件_Java NIO在文件末尾追加数据
  7. Oracle12c安装出错
  8. 最优传输理论和生成模型的几何观点
  9. How change in Console is rendered back into UI
  10. Codeforces Round #663 (Div. 2)
  11. 模拟真实环境之内网漫游
  12. ajax卡死new formdata(),使用FormData和jQuery上传Ajax大文件无法发布数据
  13. c 子类对象 访问父类对象受保护成员_面向对象三大特征: 继承
  14. 支持中国西安申办ICCV2025,见证计算机视觉蓬勃发展的20年| Vote for ICCV2025 Xi'an China...
  15. Hyperledger Composer 客户端连接Fabric网络的配置文件解析
  16. python-微信自动发送信息
  17. git clone报错Could not resolve proxy : proxy-szn
  18. 在Java开发环境中,输入某年某月某日,判断这一天是哪一年的第几天。
  19. 图像处理——分水岭算法
  20. vite+ts+vue3 知识点(定义全局函数和变量)

热门文章

  1. python程序简单快速写能谱实验word报告
  2. 设计必备----色彩标准卡
  3. 航海王燃烧意志服务器维护是什么,航海王燃烧意志12月6日更新了什么 航海王燃烧意志更新维护公告...
  4. 电脑休眠按钮灰色的解决方法
  5. 选择设计类培训学校的那些事儿
  6. program files与program files(x86)的区别
  7. Liunx环境搭建5--Docker环境搭建 tomcat+Jenkins+Python+Allure 测试环境。方法二
  8. 干货 | 浅谈机器人强化学习--从仿真到真机迁移
  9. 栈(Stack)和队列(Queue)详解
  10. android NFC的读写