`

JTree之间的drag/drop

阅读更多
关于JTree 之间的drag/drop一直找不到合适的方法。现通过鼠标事件的相应实现了该过程。希望和大家一起学习。

源码如下:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import javax.swing.tree.*;


public class DragDropTree implements MouseMotionListener,MouseListener, DragGestureListener,DragSourceListener
{


private JTree tree1=null;
private JTree tree2=null;
Object lastNode;
Vector vet=new Vector();
TreeSelectionModel selectionModel=tree1.getSelectionModel();
Vector vetnew=new Vector();
private boolean drag=false;

public DragDropTree(JTree t1,JTree t2)
{
tree1=t1;
tree2=t2;
DragSource dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(
tree1, // component where drag originates
DnDConstants.ACTION_COPY_OR_MOVE, // actions
this); // drag gesture recognizer
dragSource.createDefaultDragGestureRecognizer(
tree2, // component where drag originates
DnDConstants.ACTION_COPY_OR_MOVE, // actions
this); // drag gesture recognizer
tree1.addMouseMotionListener(this);
tree1.addMouseListener(this);
tree2.addMouseMotionListener(this);
tree2.addMouseListener(this);
}




public void mouseEntered(MouseEvent e)
{

JTree selecttree=(JTree)e.getSource();
TreePath path=selecttree.getPathForLocation(e.getX(), e.getY());
if(path!=null)
{
if(drag&vet!=null)
{
drag=false;
String str=path.getPathComponent(1).toString();

MutableTreeNode parent,node=(MutableTreeNode)path.getLastPathComponent();
if(node.isLeaf())
parent=(MutableTreeNode)node.getParent();
else
parent=node;
int index=parent.getIndex(node)+1;
System.out.println("now node is in "+index+"level");

DefaultTreeModel model=(DefaultTreeModel)tree2.getModel();

int j=0;
while(j<vet.size())
{
String ss=vet.elementAt(j).toString();
MutableTreeNode newnode=new DefaultMutableTreeNode(ss);
model.insertNodeInto(newnode,parent,index);
j++;
}
vet=null;
vet=new Vector();
}
else;

}
else;



}



public void mouseDragged(MouseEvent e){
drag=true;
if(selectionModel!=null)selectionModel.clearSelection();

}



public void mouseMoved(MouseEvent e){}

public void mouseClicked(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mousePressed(MouseEvent e)
{

lastNode=null;
if(e.getClickCount()==1)
{
TreePath path=tree1.getPathForLocation(e.getX(), e.getY());

if(path!=null){
TreeNode node=(TreeNode)path.getLastPathComponent();
if(node.isLeaf())
{
lastNode=(MutableTreeNode)path.getLastPathComponent();
TreeSelectionModel selectionModel=tree1.getSelectionModel();
int a=selectionModel.getSelectionCount();
System.out.println("node is :"+a);
if(a>1)
{

if(vetnew!=null){
System.out.println(vetnew.size()+"have so much path");
for(int n=0;n<vetnew.size();n++)
{
TreePath p=(TreePath)vetnew.get(n);
System.out.println(p);
if(p==path)path=null;
}
}
if(path!=null)

{
vet.addElement(lastNode);
vetnew.addElement(path);
}
}
else
{
if(vet!=null)
{
vet.removeAllElements();
vet.addElement(lastNode);
}
if(vetnew!=null)
{
vetnew.removeAllElements();
vetnew.addElement(path);
}
}


}
else
JOptionPane.showMessageDialog(this,"please select a leaf node!");
}
}


}
public void mouseReleased(MouseEvent e){}


public void dragGestureRecognized(DragGestureEvent e) {
// drag anything ...
e.startDrag(DragSource.DefaultCopyDrop, // cursor
new StringSelection("drag well"), // transferable
this); // drag source listener
drag=true;
}
public void dragDropEnd(DragSourceDropEvent e) {}
public void dragEnter(DragSourceDragEvent e) {}
public void dragExit(DragSourceEvent e) {}
public void dragOver(DragSourceDragEvent e) {}
public void dropActionChanged(DragSourceDragEvent e) {}
}
分享到:
评论

相关推荐

    JTree的例子,可以拖动节点

    拖放(Drag and Drop,简称DnD)是人机交互的一种方式,允许用户通过鼠标或其他输入设备将一个对象从一处移动到另一处。在`JTree`中实现拖放功能,我们需要利用Java Swing提供的`TransferHandler`类和一些相关的事件...

    JTree 更新版 不错的树形控件

    JTree还支持拖放操作(Drag and Drop),允许用户重新排列节点。 压缩包中的“JTree”文件可能是一个包含了示例代码或者更新后JTree类的Java源文件。为了更好地理解这个更新版JTree控件的工作方式,你可以检查这个...

    (java) JTree控件的拖拽,拖动

    本篇文章将深入探讨如何在`JTree`中实现拖拽(Drag and Drop,简称DnD)功能,使用户能够通过拖动节点来重新组织树形结构。 首先,为了启用`JTree`的拖放功能,我们需要在`JTree`实例上注册一个`DragSource`和`...

    java中JTree高级编程

    此外,JTree还支持**扩展功能**,例如拖放操作(Drag and Drop)和树节点的搜索。通过实现DragSource和DropTarget接口,可以启用JTree的拖放功能,允许用户重新排列节点。至于搜索功能,可以通过遍历TreeModel并对比...

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

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

    DragTreeTest

    JTree不仅支持基本的浏览操作,还支持拖放(Drag and Drop)功能,允许用户通过鼠标操作移动文件或目录,增强了用户体验。 在实现过程中,"DragTreeTest"首先需要构建树形数据模型。这个模型通常是一个...

    生成可拖拽的树状结构,节点可以通过拖拽移动,插入

    在Swing中,我们可以利用JTree创建一个可拖放(Drag and Drop)的树状结构,使得用户能够通过简单的拖拽操作来移动或插入节点。这种功能在数据组织和展示时非常实用,例如在文件系统管理、项目管理或复杂数据结构的...

    java swing拖放功能

    其中,拖放(Drag and Drop)功能是 Java Swing 中的一种重要功能,允许用户在应用程序中实现拖放操作。在本文中,我们将详细介绍 Java Swing 中的拖放功能,包括其实现原理、常用组件支持、事件处理机制等方面的...

    swing hacking code

    `Ch09-DragAndDrop`章节介绍了Java的拖放(Drag and Drop)功能,它是用户界面交互的重要部分。Swing提供了拖放支持,使得在组件之间移动数据变得简单。 `Ch11-NativeIntegrationAndPackaging`章节则探讨了Swing如何...

    swing hack源码

    8. **Ch09-DragAndDrop**:Swing支持拖放(Drag and Drop)操作,这部分源码可能包含了实现拖放功能的示例代码,允许用户通过拖动来移动或复制数据。 9. **Ch11-NativeIntegrationAndPackaging**:这部分可能关注于...

    Pro.Java.8.Programming.3rd.Edition.1484206428

    How to build a better Java UI/UX using layout managers, Swing's JTable and JTree APIs, cut-and-paste, and drag-and-drop How to use Java Database Connectivity (JDBC) to connect and integrate with ...

    Pro.Java.8.Programming.3rd.Edition.1484206428.epub

    How to build a better Java UI/UX using layout managers, Swing's JTable and JTree APIs, cut-and-paste, and drag-and-drop How to use Java Database Connectivity (JDBC) to connect and integrate with ...

    \Java基础类 \Java基础类

    **Drag & Drop**技术允许用户通过简单的拖放操作在Java应用程序之间交换数据。这一特性增强了Java应用程序与其他应用程序的互操作性,无论这些应用程序是否支持Java技术。 **Swing**是JFC的核心部分,它是AWT的增强...

    Swing Hacks

    This chapter revelas the secrets of these mystic componentsfrom Excel exporting to proper JTree drop targets. Make the JTree and JTable dance. Chapter 4, File Choosers One of Swing's most maligned...

    Java目录树控件

    7. **拖放功能(Drag and Drop)**: 如果需要支持文件或目录的拖放操作,可以实现`DragSource`和`DropTarget`接口,使`JTree`具有拖放功能。 8. **性能优化**: 当目录树很大时,为了提高性能,可以使用懒加载策略。...

    swing文件拖拽

    class DragTree extends JTree implements DragGestureListener, DragSourceListener, DropTargetListener { /** * */ private static final long serialVersionUID = 1L; BufferedImage ghostImage; ...

    文件图标化展示拖拽上传.zip

    HTML5引入了拖放API(Drag and Drop API),允许用户通过拖动元素(如文件)到指定区域进行上传。在HTML5中,主要使用`dragstart`、`dragenter`、`dragover`、`drop`等事件来监听并处理拖放操作。为了实现文件上传,...

    swingx-1.6

    4. **拖放功能**:SwingX增强了Java的拖放(Drag and Drop)功能,使得在应用程序内部和应用程序之间交换数据变得更加简单。 5. **打印支持**:SwingX提供了JXPrinter和JXPrintTask类,使得开发者可以轻松实现组件...

    SwingTutorialExamples.zip

    9. **拖放功能**: `dnd`可能涵盖了Swing的拖放(Drag and Drop, DnD)功能,这使得用户可以通过鼠标操作在组件之间移动数据。 这些例子是学习Swing不可或缺的资源,它们不仅演示了如何使用Swing组件,还展示了如何...

Global site tag (gtag.js) - Google Analytics