`

Swing拖拽效果

阅读更多
Swing的拖拽貌似挺复杂的效果,其实实现起来还是很容易的。只需要对控件实现DropTargetListener接口即可。
运行效果如下图:


拖拽文件到该空间后,我们获得文件基本信息,并显示,更具体的显示效果您可以自己去控制。拖拽文件后的效果:


程序完成代码:
package com.zakisoft.drug;

/**
 *   @author   zakisoft.com
 */

import java.awt.Container;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class DropTargetTest {
	private DropTargetTest() {
		JFrame frame = new DropTargetFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		new DropTargetTest();
	}
}

class DropTargetFrame extends JFrame {

	private static final long serialVersionUID = 6197629178772816152L;

	public DropTargetFrame() {
		setTitle("Swing拖拽的例子 Zakisoft.com");
		setSize(600, 400);
		setLocationRelativeTo(getOwner()); 
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		Container contentPane = getContentPane();
		JTextArea textArea = new JTextArea(
				"请拖拽文件到该区域.\n ");

		new DropTarget(textArea, new TextDropTargetListener(textArea));
		contentPane.add(new JScrollPane(textArea), "Center");
	}
}

class TextDropTargetListener implements DropTargetListener {
	public TextDropTargetListener(JTextArea ta) {
		textArea = ta;
	}

	public void dragEnter(DropTargetDragEvent event) {
		int a = event.getDropAction();
		if ((a & DnDConstants.ACTION_COPY) != 0)
			textArea.append("ACTION_COPY\n ");
		if ((a & DnDConstants.ACTION_MOVE) != 0)
			textArea.append("ACTION_MOVE\n ");
		if ((a & DnDConstants.ACTION_LINK) != 0)
			textArea.append("ACTION_LINK\n ");

		if (!isDragAcceptable(event)) {
			event.rejectDrag();
			return;
		}
	}

	public void dragExit(DropTargetEvent event) {
	}

	public void dragOver(DropTargetDragEvent event) {
	}

	public void dropActionChanged(DropTargetDragEvent event) {
		if (!isDragAcceptable(event)) {
			event.rejectDrag();
			return;
		}
	}

	public void drop(DropTargetDropEvent event) {
		if (!isDropAcceptable(event)) {
			event.rejectDrop();
			return;
		}

		event.acceptDrop(DnDConstants.ACTION_COPY);

		Transferable transferable = event.getTransferable();

		DataFlavor[] flavors = transferable.getTransferDataFlavors();
		for (int i = 0; i < flavors.length; i++) {
			DataFlavor d = flavors[i];
			textArea.append("MIME   type= " + d.getMimeType() + "\n ");

			try {
				if (d.equals(DataFlavor.javaFileListFlavor)) {
					List<?> fileList = (List<?>) transferable
							.getTransferData(d);
					Iterator<?> iterator = fileList.iterator();
					while (iterator.hasNext()) {
						File f = (File) iterator.next();
						textArea.append(f + "\n ");
					}
				} else if (d.equals(DataFlavor.stringFlavor)) {
					String s = (String) transferable.getTransferData(d);
					textArea.append(s + "\n ");
				} else if (d.isMimeTypeEqual("text/plain ")) {
					String charset = d.getParameter("charset ");
					InputStream in = (InputStream) transferable
							.getTransferData(d);

					boolean more = true;
					int ch;
					if (charset.equals("ascii ")) {
						do {
							ch = in.read();
							if (ch != 0 && ch != -1)
								textArea.append(" " + (char) ch);
							else
								more = false;
						} while (more);
					} else if (charset.equals("unicode ")) {
						boolean littleEndian = true;
						do {
							ch = in.read();
							int ch2 = in.read();
							if (ch != -1 && littleEndian)
								ch = (ch & 0xFF) | ((ch2 & 0xFF) << 8);
							if (ch == 0xFFFE)
								littleEndian = false;
							else if (ch != 0 && ch != -1)
								textArea.append(" " + (char) ch);
							else
								more = false;
						} while (more);
					}

					textArea.append("\n ");
				}
			} catch (Exception e) {
				textArea.append("Error:   " + e + "\n ");
			}
		}
		event.dropComplete(true);
	}

	public boolean isDragAcceptable(DropTargetDragEvent event) {
		return (event.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) != 0;
	}

	public boolean isDropAcceptable(DropTargetDropEvent event) {
		return (event.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) != 0;
	}

	private JTextArea textArea;
}

分享到:
评论

相关推荐

    Java swing鼠标拖拽功能源码

    在Java Swing库中,实现鼠标拖拽功能是构建桌面应用程序时常见的需求,它涉及到事件处理、组件交互以及图形用户界面(GUI)的设计。本源码着重于如何在Swing组件上实现鼠标拖放操作,这对于创建自定义组件或增强已有...

    swing之拖拽功能DragDemo

    在Java的Swing库中,拖放(Drag and Drop,简称DnD)功能是一种用户友好的交互方式,允许用户通过鼠标操作将一个组件中的数据拖放到另一个组件上。本教程将聚焦于“swing之拖拽功能DragDemo”,探讨如何在Swing应用...

    swing是一款可以容器中的卡片元素拖拽到容器外的js拖拽插件

    Swing 是一个JavaScript库,专为实现容器内卡片元素的拖拽功能而设计,尤其吸引人的是它提供了独特的视觉效果,当用户尝试将卡片元素移出容器时,卡片会呈现出逼真的弹性摇摆效果。这一特性使 Swing 成为了前端...

    带弹性摇摆效果的卡片js拖拽插件swing

    今天我们将讨论一个基于jQuery的插件——"swing",它为卡片元素提供了独特的拖拽功能,特别是在卡片移出容器时添加了引人注目的弹性摇摆效果。 "swing"插件的核心功能在于实现卡片元素的拖拽行为。用户可以通过鼠标...

    swing组件透明拖动

    本篇文章将深入探讨如何在Swing中实现组件的透明效果以及拖动功能。 首先,我们来理解Swing组件的透明度设置。在Java中,我们可以使用`setOpaque(false)`方法来使组件变得透明。这个方法会告诉组件不要绘制其背景,...

    swing炫酷界面与功能实现

    JLayer 和 LayerUI 提供了高级装饰功能,可以方便地添加阴影、拖拽效果等。 对于功能实现,Swing 提供了丰富的组件功能。比如,JTable 可用于显示和编辑表格数据,JTree 显示层次结构的数据,JList 显示可选项目...

    swing 拖动控件

    在实际应用中,我们还需要考虑一些额外的细节,如边界检查,确保组件不会拖出父容器的范围。此外,还可以通过设置组件的布局管理器为null,以允许自由移动组件。当然,对于更复杂的拖放操作,可能需要用到DragSource...

    Swing组件的DnD拖拽深度分析

    然后,AWT-WINDOWS线程可能会接管实际的窗口移动,但所有与用户界面更新相关的操作,如显示拖动效果,仍会在EDT上进行。拖放结束时,数据交换和结果处理也都在EDT上完成。 为了实现自定义的DnD功能,开发者需要设置...

    MyEclipse 中Swing的可视化开发

    在提供的压缩包文件中,"swing-exe.jar"可能是一个包含Swing应用的可执行JAR文件,用户可以直接运行查看Swing组件的实际效果。而"visual-swing"可能是MyEclipse中用于Swing可视化编辑的插件或者库文件,它扩展了IDE...

    Java swing秒表

    总的来说,这个Java Swing秒表项目展示了Swing的强大功能,包括自定义窗口外观、透明效果、事件处理以及程序启动的便捷性。通过深入学习和理解这些知识点,开发者不仅可以掌握Swing的基本用法,还能进一步提升在Java...

    所支持拖拽功能的Swing-JTree代码

    这篇博客文章“所支持拖拽功能的Swing-JTree代码”探讨了如何增强JTree的功能,使其支持拖放(Drag and Drop)操作,这是在图形用户界面设计中非常实用的一个特性。 拖放功能允许用户通过鼠标将一个项目从一处拖到...

    javaswing代码

    - **鼠标适配器**:`MouseAdapter`类为处理鼠标事件提供了一个基础,通过扩展`MouseAdapter`并覆盖特定的方法来响应鼠标事件,如点击、拖拽等。 - **监听器模式**:实现`ActionListener`接口来处理鼠标点击事件。当...

    java实现在JFrame窗口进行图片拖拽

    我们需要创建一个自定义的`TransferHandler`子类,重写其中的`importData`方法,以便在图片被拖放到`JFrame`时处理数据。 在实际代码中,你可能会使用`DataFlavor`来识别拖放的数据类型,使用`FileDrop`库简化文件...

    基于jquery UI的拖拽摇摆效果插件

    这里的`.draggable-element`是你要设置拖拽效果的元素选择器,`swing: true`参数则启用了摇摆效果。 4. **自定义效果**:SwingDrag通常会提供一些配置选项,允许开发者自定义摇摆效果的样式和行为。例如,你可以...

    swing可视化开发插件

    而Swing可视化开发插件正是为了解决这个问题,它提供了所见即所得(WYSIWYG)的界面编辑器,允许开发者直接拖拽组件,调整大小和位置,设置各种属性,大大降低了开发复杂性。 JFrame是Swing中的顶级容器,是大多数...

    Java界面(Swing And AWT)非常非常好的一份资料

    它通过直观的图形元素(如按钮、菜单等)以及便捷的操作方式(如鼠标点击、拖拽等),简化了用户与系统的互动过程,极大地提升了用户体验。对于Java开发者来说,理解和掌握GUI的构建方法是至关重要的。 #### 创建...

    Java Swing中的可拖动组件

    解压并运行这个JAR,可以直观地看到可拖动组件在实际应用中的效果。 7. **源码分析** "Source_Files.zip" 包含了源代码,你可以通过查看和学习这些代码来深入理解拖动组件的实现细节。源码通常包括类的设计、事件...

    JList 上下左右拖动

    在Java Swing库中,`JList`是一个常用的组件,用于展示一系列可选择的项。它在用户界面设计中常用于创建列表视图,允许用户通过单击或键盘导航来选择项目。在本教程中,我们将深入探讨如何实现`JList`的上下左右拖动...

    visual swing for eclipes插件(含安装教程) java可视化界面设计插件

    - **设计界面**:在编辑器中,你可以从工具栏中选择Swing组件,然后将它们拖放到设计面板上。可以通过属性窗口调整组件的大小、位置、颜色等属性。 - **保存与运行**:完成设计后,保存Java文件,然后右键单击项目...

    java拖拽透明组件源码

    在Swing中,我们可以实现一些高级特性,比如拖拽功能和透明组件。在这个“java拖拽透明组件源码”中,我们主要关注的是如何在Swing环境中创建一个可拖动的透明组件。 拖拽功能在Java中可以通过实现`TransferHandler...

Global site tag (gtag.js) - Google Analytics