`
aerchi
  • 浏览: 427742 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
文章分类
社区版块
存档分类
最新评论

java 程序里如何实现从一个列表中拖动一个元素到另一个列表中?

 
阅读更多
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;


import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;


public class DnDDemoList2List extends JFrame {


public DnDDemoList2List() {
getContentPane().setLayout(new GridLayout(2, 1));
getContentPane().add(createList());
getContentPane().add(createList());
}


private JPanel createList() {
DefaultListModel listModel = new DefaultListModel();
listModel.addElement("List 0");
listModel.addElement("List 1");
listModel.addElement("List 2");
listModel.addElement("List 3");
listModel.addElement("List 4");
listModel.addElement("List 5");
listModel.addElement("List 6");
listModel.addElement("List 7");
listModel.addElement("List 8");


JList list = new JList(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
JScrollPane scrollPane = new JScrollPane(list);
scrollPane.setPreferredSize(new Dimension(400, 100));


list.setDragEnabled(true);
list.setTransferHandler(new ListTransferHandler());


JPanel panel = new JPanel(new BorderLayout());
panel.add(scrollPane, BorderLayout.CENTER);
panel.setBorder(BorderFactory.createTitledBorder("List"));
return panel;
}


public static void main(String[] args) {


DnDDemoList2List frame = new DnDDemoList2List();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


frame.pack();
frame.setVisible(true);
}
}


class ListTransferHandler extends TransferHandler {
private int[] indices = null;
private int addIndex = -1;
private int addCount = 0;


protected String exportString(JComponent c) {
JList list = (JList) c;
indices = list.getSelectedIndices();
Object[] values = list.getSelectedValues();


StringBuffer buff = new StringBuffer();


for (int i = 0; i < values.length; i++) {
Object val = values[i];
buff.append(val == null ? "" : val.toString());
if (i != values.length - 1) {
buff.append("\n");
}
}


return buff.toString();
}


protected void importString(JComponent c, String str) {
JList target = (JList) c;
DefaultListModel listModel = (DefaultListModel) target.getModel();
int index = target.getSelectedIndex();


if (indices != null && index >= indices[0] - 1
&& index <= indices[indices.length - 1]) {
indices = null;
return;
}


int max = listModel.getSize();
if (index < 0) {
index = max;
} else {
index++;
if (index > max) {
index = max;
}
}
addIndex = index;
String[] values = str.split("\n");
addCount = values.length;
for (int i = 0; i < values.length; i++) {
listModel.add(index++, values[i]);
}
}


protected void cleanup(JComponent c, boolean remove) {
if (remove && indices != null) {
JList source = (JList) c;
DefaultListModel model = (DefaultListModel) source.getModel();
if (addCount > 0) {
for (int i = 0; i < indices.length; i++) {
if (indices[i] > addIndex) {
indices[i] += addCount;
}
}
}
for (int i = indices.length - 1; i >= 0; i--) {
model.remove(indices[i]);
}
}
indices = null;
addCount = 0;
addIndex = -1;
}


protected Transferable createTransferable(JComponent c) {
return new StringSelection(exportString(c));
}


public int getSourceActions(JComponent c) {
return COPY_OR_MOVE;
}


public boolean importData(JComponent c, Transferable t) {
if (canImport(c, t.getTransferDataFlavors())) {
try {
String str = (String) t
.getTransferData(DataFlavor.stringFlavor);
importString(c, str);
return true;
} catch (UnsupportedFlavorException ufe) {
} catch (IOException ioe) {
}
}


return false;
}


protected void exportDone(JComponent c, Transferable data, int action) {
cleanup(c, action == MOVE);
}


public boolean canImport(JComponent c, DataFlavor[] flavors) {
for (int i = 0; i < flavors.length; i++) {
if (DataFlavor.stringFlavor.equals(flavors[i])) {
return true;
}
}
return false;
}
}
分享到:
评论

相关推荐

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    疯狂JAVA讲义

    我把另一个构造器里的代码复制、粘贴到这个构造器里不就可以了吗? 143 5.6 类的继承 144 5.6.1 继承的特点 144 5.6.2 重写父类的方法 145 5.6.3 父类实例的super引用 146 学生提问:我们只是创建了一个Ostrich...

    Java语言程序设计课程设计实训项目——模拟实现Windows-资源管理器的GUI界面(第3部分).pdf

    精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 1/22 页 1.1 模拟实现 Windows 资源管理器的 GUI 界面(第 3 部分) 1.1.1 为主窗口添加工具条 1、在窗口的北部添加一个工具条面板...

    web-kanban:一个 js 应用程序和一些 java REST 服务来显示一个板

    网络看板 一个简单的 JavaScript 应用程序,用于在网页上显示可拖动的票证。为什么是另一个看板应用程序? 动机是拥有一个简单的工具,可以在离线 Java 环境中轻松托管。 不幸的是, 出售托管版本的 trello。 都是...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows系统的运行对话框 界面 23 实例017 设计计算器程序界面 26 实例018 设计关于进销存管理系统的界面 27 第2章 ...

    html5文件上传器演示

    客户端完全基于JavaScript的浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务端处理,由服务端存储断点信息实现断点...

    快速开发平台-源代码-cloud版

    一站式生成APP应用:可以轻松搭建出IOS和Android系统的移动端应用,实现各类功能一站聚合、多端接入,实现前端对接后台数据的操作,可以快速获取前台传到后台数据; IM通讯:IM系统同时兼容PC端、手机客户端App、...

    Android开发应用实战详解源代码

    3.11 将数据返回到前一个activity 3.12 对话框交互处理 3.13 文字颜色置换 3.14 文字字体设置 3.15 拖动相片特效 3.16 简易计算器 3.17 about信息 3.18 加载中的程序 3.19 选择对话框 3.20 主题变换 3.21 小结 第4章...

    Birt中文手册.chm

    目录 学习基础知识 教程 1:构建简单的列表报告 任务 1:创建新项目 任务 2:创建新报告 任务 3:构建数据源 ...如何创建事件处理程序类并将其添加到 Java 项目中 如何使 Java 类与报告元素相关联

    java企业级快速开发平台

    1、用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2、部门管理:配置系统组织机构(公司、部门),树结构展现支持数据权限。...16、产品许可: 对项目进行许可证书控制,防止程序拷贝运行。

    网页与Web程序设计 课件 ppt 机械工业出版社 part1

    对于个人,可以按照爱好和兴趣建立一个具有独特风格的网站,通过它来展示自我,共享资源;对于政府机关,可以利用网站宣传政策法规和进行网络办公,实现电子政务。因此,网页设计和制作技术越来越受到重视。  目前...

    birt中文帮助文档

    如何创建事件处理程序类并将其添加到 Java 项目中 如何使 Java 类与报告元素相关联 第二十四章、脚本编制参考 类 DateTimeSpan DateTimeSpan.addDate DateTimeSpan.addTime DateTimeSpan.days DateTimeSpan.hours ...

    Google.Android开发入门与实战

     由于Android平台被推出的时间才一年左右,了解Android平台软件开发技术的程序员还不多,如何迅速地推广和普及Android平台软件开发技术,让越来越多的人参与到Android应用的开发中,是整个产业链都在关注的一个话题...

    springboot构建后台项目

    可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 诺寒基于hplus和inspinia...

    android开发入门与实战(下)

    12.4.2 实现一个自己的ContentHandler 12.4.3 Activity的实现 12.5 本章小结 第13章 Android综合案例二——基于GoogleMap开发个人移动地图 13.1 项目UI规划 13.2 数据存储实现 13.2.1 设计数据库及表结构 13.2.2 ...

    android开发入门与实战(上)

    12.4.2 实现一个自己的ContentHandler 12.4.3 Activity的实现 12.5 本章小结 第13章 Android综合案例二——基于GoogleMap开发个人移动地图 13.1 项目UI规划 13.2 数据存储实现 13.2.1 设计数据库及表结构 13.2.2 ...

    强大的若依后台管理系统

    她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。 内置功能 用户管理:用户是系统操作者,该功能主要...

Global site tag (gtag.js) - Google Analytics