`

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

分享到:
评论

相关推荐

    swing组件透明拖动

    swing组件透明拖动,透明效果可以设置

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

    swing是一款可以容器中的卡片元素拖拽到容器外的js拖拽插件。该拖拽插件在拖动卡片元素到容器外后,放下卡片时有很酷的卡片弹性左右摇摆效果。如果拖动距离不够,卡片将被拉回容器中。

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

    swing是一款可以容器中的卡片元素拖拽到容器外的js拖拽插件。该拖拽插件在拖动卡片元素到容器外后,放下卡片时有很酷的卡片弹性左右摇摆效果。如果拖动距离不够,卡片将被拉回容器中。

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

    博文链接:https://xiancoder.iteye.com/blog/75830

    custom-swing-components

    这个存储库由几个定制的java swing组件组成,可以在任何java项目中导入,可以在netbeans的swing托盘中导入,可以拖放到swing ui中以方便高效使用。这些组件添加到th ui 之美,因为其中一些涉及动画效果和表示数据的...

    Java GUI 学习课程

    JavaFX则是Java SE 8之后引入的新一代GUI工具包,它更加现代化和灵活,支持丰富的特效和动画效果。 无论你选择使用Swing还是JavaFX,Java提供了可视化的开发工具(如NetBeans和Eclipse)和丰富的文档和教程,以帮助...

    ViewDijkstra.zip

    使用JAVA SWing实现鼠标点击拖拽绘制图,自行设置边权,自行设置源点,动态演示Dijkstra求单源最短路的过程。成品效果见https://blog.csdn.net/qq_44643644/article/details/118517988

    myeclipse8可视化图形界面插件添加

    还在为基于C/S模式,使用GUI的Swing组件开发的界面排版烦恼吗,快使用可视化图形界面吧,至少各个组件的位置可以通过直接拖拽来设置,字体,大小位置,颜色等属性可以直接在界面上操作,而不用再通过写代码控制,...

    java源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java源码包2

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java源码包3

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java源码包4

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰效果 Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰效果 Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、...

Global site tag (gtag.js) - Google Analytics