树:拖放 : 树 « 图形用户界面 « Java

En
Java
1. 图形用户界面
2. 三维图形动画
3. 高级图形
4. 蚂蚁编译
5. Apache类库
6. 统计图
7. 
8. 集合数据结构
9. 数据类型
10. 数据库JDBC
11. 设计模式
12. 开发相关类
13. EJB3
14. 电子邮件
15. 事件
16. 文件输入输出
17. 游戏
18. 泛型
19. GWT
20. Hibernate
21. 本地化
22. J2EE平台
23. 基于J2ME
24. JDK-6
25. JNDI的LDAP
26. JPA
27. JSP技术
28. JSTL
29. 语言基础知识
30. 网络协议
31. PDF格式RTF格式
32. 映射
33. 常规表达式
34. 脚本
35. 安全
36. Servlets
37. Spring
38. Swing组件
39. 图形用户界面
40. SWT-JFace-Eclipse
41. 线程
42. 应用程序
43. Velocity
44. Web服务SOA
45. 可扩展标记语言
Java 教程
Java » 图形用户界面 » 屏幕截图 
树:拖放
树:拖放

/*
Definitive Guide to Swing for Java 2, Second Edition
By John Zukowski     
ISBN: 1-893115-78-X
Publisher: APress
*/

import java.awt.BorderLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.Autoscroll;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceContext;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
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.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Iterator;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class TreeTester {
  public static void main(String args[]) {
    JFrame f = new JFrame("Tree Dragging Tester");
    DndTree tree1 = new DndTree();
    JScrollPane leftPane = new JScrollPane(tree1);
    DndTree tree2 = new DndTree();
    JScrollPane rightPane = new JScrollPane(tree2);
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
        leftPane, rightPane);
    f.getContentPane().add(splitPane, BorderLayout.CENTER);
    f.setSize(300200);
    f.setVisible(true);
  }
}

class DndTree extends JTree implements Autoscroll {

  private Insets insets;

  private int top = 0, bottom = 0, topRow = 0, bottomRow = 0;

  public DndTree() {
    DragSource dragSource = DragSource.getDefaultDragSource();
    dragSource
        .createDefaultDragGestureRecognizer(this,
            DnDConstants.ACTION_COPY_OR_MOVE,
            new TreeDragGestureListener());
    DropTarget dropTarget = new DropTarget(this,
        new TreeDropTargetListener());
  }

  public DndTree(TreeModel model) {
    super(model);
    DragSource dragSource = DragSource.getDefaultDragSource();
    dragSource
        .createDefaultDragGestureRecognizer(this,
            DnDConstants.ACTION_COPY_OR_MOVE,
            new TreeDragGestureListener());
    DropTarget dropTarget = new DropTarget(this,
        new TreeDropTargetListener());
  }

  public Insets getAutoscrollInsets() {
    return insets;
  }

  public void autoscroll(Point p) {
    // Only support up/down scrolling
    top = Math.abs(getLocation().y10;
    bottom = top + getParent().getHeight() 20;
    int next;
    if (p.y < top) {
      next = topRow--;
      bottomRow++;
      scrollRowToVisible(next);
    else if (p.y > bottom) {
      next = bottomRow++;
      topRow--;
      scrollRowToVisible(next);
    }
  }

  private static class TreeDragGestureListener implements DragGestureListener {
    public void dragGestureRecognized(DragGestureEvent dragGestureEvent) {
      // Can only drag leafs
      JTree tree = (JTreedragGestureEvent.getComponent();
      TreePath path = tree.getSelectionPath();
      if (path == null) {
        // Nothing selected, nothing to drag
        System.out.println("Nothing selected - beep");
        tree.getToolkit().beep();
      else {
        DefaultMutableTreeNode selection = (DefaultMutableTreeNodepath
            .getLastPathComponent();
        if (selection.isLeaf()) {
          TransferableTreeNode node = new TransferableTreeNode(
              selection);
          dragGestureEvent.startDrag(DragSource.DefaultCopyDrop,
              node, new MyDragSourceListener());
        else {
          System.out.println("Not a leaf - beep");
          tree.getToolkit().beep();
        }
      }
    }
  }

  private class TreeDropTargetListener implements DropTargetListener {

    public void dragEnter(DropTargetDragEvent dropTargetDragEvent) {
      // Setup positioning info for auto-scrolling
      top = Math.abs(getLocation().y);
      bottom = top + getParent().getHeight();
      topRow = getClosestRowForLocation(0, top);
      bottomRow = getClosestRowForLocation(0, bottom);
      insets = new Insets(top + 100, bottom - 10, getWidth());
    }

    public void dragExit(DropTargetEvent dropTargetEvent) {
    }

    public void dragOver(DropTargetDragEvent dropTargetDragEvent) {
    }

    public void dropActionChanged(DropTargetDragEvent dropTargetDragEvent) {
    }

    public synchronized void drop(DropTargetDropEvent dropTargetDropEvent) {
      // Only support dropping over nodes that aren't leafs

      Point location = dropTargetDropEvent.getLocation();
      TreePath path = getPathForLocation(location.x, location.y);
      Object node = path.getLastPathComponent();
      if ((node != null&& (node instanceof TreeNode)
          && (!((TreeNodenode).isLeaf())) {
        try {
          Transferable tr = dropTargetDropEvent.getTransferable();
          if (tr
              .isDataFlavorSupported(TransferableTreeNode.DEFAULT_MUTABLE_TREENODE_FLAVOR)) {
            dropTargetDropEvent
                .acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
            Object userObject = tr
                .getTransferData(TransferableTreeNode.DEFAULT_MUTABLE_TREENODE_FLAVOR);
            addElement(path, userObject);
            dropTargetDropEvent.dropComplete(true);
          else if (tr
              .isDataFlavorSupported(DataFlavor.stringFlavor)) {
            dropTargetDropEvent
                .acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
            String string = (Stringtr
                .getTransferData(DataFlavor.stringFlavor);
            addElement(path, string);
            dropTargetDropEvent.dropComplete(true);
          else if (tr
              .isDataFlavorSupported(DataFlavor.plainTextFlavor)) {
            dropTargetDropEvent
                .acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
            Object stream = tr
                .getTransferData(DataFlavor.plainTextFlavor);
            if (stream instanceof InputStream) {
              InputStreamReader isr = new InputStreamReader(
                  (InputStreamstream);
              BufferedReader reader = new BufferedReader(isr);
              String line;
              while ((line = reader.readLine()) != null) {
                addElement(path, line);
              }
              dropTargetDropEvent.dropComplete(true);
            else if (stream instanceof Reader) {
              BufferedReader reader = new BufferedReader(
                  (Readerstream);
              String line;
              while ((line = reader.readLine()) != null) {
                addElement(path, line);
              }
              dropTargetDropEvent.dropComplete(true);
            else {
              System.err.println("Unknown type: "
                  + stream.getClass());
              dropTargetDropEvent.rejectDrop();
            }
          else if (tr
              .isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
            dropTargetDropEvent
                .acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
            List fileList = (Listtr
                .getTransferData(DataFlavor.javaFileListFlavor);
            Iterator iterator = fileList.iterator();
            while (iterator.hasNext()) {
              File file = (Fileiterator.next();
              addElement(path, file.toURL());
            }
            dropTargetDropEvent.dropComplete(true);
          else {
            System.err.println("Rejected");
            dropTargetDropEvent.rejectDrop();
          }
        catch (IOException io) {
          io.printStackTrace();
          dropTargetDropEvent.rejectDrop();
        catch (UnsupportedFlavorException ufe) {
          ufe.printStackTrace();
          dropTargetDropEvent.rejectDrop();
        }
      else {
        System.out.println("Can't drop on a leaf");
        dropTargetDropEvent.rejectDrop();
      }
    }

    private void addElement(TreePath path, Object element) {
      DefaultMutableTreeNode parent = (DefaultMutableTreeNodepath
          .getLastPathComponent();
      DefaultMutableTreeNode node = new DefaultMutableTreeNode(element);
      System.out.println("Added: " + node + " to " + parent);
      DefaultTreeModel model = (DefaultTreeModel) (DndTree.this
          .getModel());
      model.insertNodeInto(node, parent, parent.getChildCount());
    }
  }

  private static class MyDragSourceListener implements DragSourceListener {
    public void dragDropEnd(DragSourceDropEvent dragSourceDropEvent) {
      if (dragSourceDropEvent.getDropSuccess()) {
        int dropAction = dragSourceDropEvent.getDropAction();
        if (dropAction == DnDConstants.ACTION_MOVE) {
          System.out.println("MOVE: remove node");
        }
      }
    }

    public void dragEnter(DragSourceDragEvent dragSourceDragEvent) {
      DragSourceContext context = dragSourceDragEvent
          .getDragSourceContext();
      int dropAction = dragSourceDragEvent.getDropAction();
      if ((dropAction & DnDConstants.ACTION_COPY!= 0) {
        context.setCursor(DragSource.DefaultCopyDrop);
      else if ((dropAction & DnDConstants.ACTION_MOVE!= 0) {
        context.setCursor(DragSource.DefaultMoveDrop);
      else {
        context.setCursor(DragSource.DefaultCopyNoDrop);
      }
    }

    public void dragExit(DragSourceEvent dragSourceEvent) {
    }

    public void dragOver(DragSourceDragEvent dragSourceDragEvent) {
    }

    public void dropActionChanged(DragSourceDragEvent dragSourceDragEvent) {
    }
  }
}

class TransferableTreeNode extends DefaultMutableTreeNode implements
    Transferable {
  final static int TREE = 0;

  final static int STRING = 1;

  final static int PLAIN_TEXT = 1;

  final public static DataFlavor DEFAULT_MUTABLE_TREENODE_FLAVOR = new DataFlavor(
      DefaultMutableTreeNode.class, "Default Mutable Tree Node");

  static DataFlavor flavors[] DEFAULT_MUTABLE_TREENODE_FLAVOR,
      DataFlavor.stringFlavor, DataFlavor.plainTextFlavor };

  private DefaultMutableTreeNode data;

  public TransferableTreeNode(DefaultMutableTreeNode data) {
    this.data = data;
  }

  public DataFlavor[] getTransferDataFlavors() {
    return flavors;
  }

  public Object getTransferData(DataFlavor flavor)
      throws UnsupportedFlavorException, IOException {
    Object returnObject;
    if (flavor.equals(flavors[TREE])) {
      Object userObject = data.getUserObject();
      if (userObject == null) {
        returnObject = data;
      else {
        returnObject = userObject;
      }
    else if (flavor.equals(flavors[STRING])) {
      Object userObject = data.getUserObject();
      if (userObject == null) {
        returnObject = data.toString();
      else {
        returnObject = userObject.toString();
      }
    else if (flavor.equals(flavors[PLAIN_TEXT])) {
      Object userObject = data.getUserObject();
      String string;
      if (userObject == null) {
        string = data.toString();
      else {
        string = userObject.toString();
      }
      returnObject = new ByteArrayInputStream(string.getBytes("Unicode"));
    else {
      throw new UnsupportedFlavorException(flavor);
    }
    return returnObject;
  }

  public boolean isDataFlavorSupported(DataFlavor flavor) {
    boolean returnValue = false;
    for (int i = 0, n = flavors.length; i < n; i++) {
      if (flavor.equals(flavors[i])) {
        returnValue = true;
        break;
      }
    }
    return returnValue;
  }
}

           
       
Related examples in the same category
1. 建立一个基于DefaultMutableTreeNode的树建立一个基于DefaultMutableTreeNode的树
2. 添加树到JScrollPane添加树到JScrollPane
3. 谱系树谱系树
4. 树线树线
5. DefaultMutableTreeNode节点树样本DefaultMutableTreeNode节点树样本
6. 在一个JTree显示一个文件系统在一个JTree显示一个文件系统
7. 基于JTree的类浏览器基于JTree的类浏览器
8. 显示类树显示类树
9. 编辑树编辑树
10. 实现TreeSelectionListener创建自己事件监听实现TreeSelectionListener创建自己事件监听
11. 文件夹树图示文件夹树图示
12. 文件树弹出菜单文件树弹出菜单
13. 文件树工具提示文件树工具提示
14. 祖树图标祖树图标
15. 树图示演示树图示演示
16. DefaultMutableTreeNode和用户对象DefaultMutableTreeNode和用户对象
17. 在树上显示用户对象在树上显示用户对象
18. 树展开事件演示树展开事件演示
19. 树打开图示树打开图示
20. 遍历树遍历树
21. 基于数组结构树基于数组结构树
22. 树将打开事件和监听树将打开事件和监听
23. 设置树线设置树线
24. 树选择树选择
25. JTree.DynamicUtilTreeNode.createChildrenJTree.DynamicUtilTreeNode.createChildren
26. 安装提示工具( JTree )安装提示工具( JTree )
27. 树展开事件演示2树展开事件演示2
28. 添加控件到JTree添加控件到JTree
29. 组件拖放文件到树组件拖放文件到树
30. DnD (drag and drop)JTree code DnD (drag and drop)JTree code
31. 建立了一棵树,填充hashtables建立了一棵树,填充hashtables
32. A simple test to see how we can build a tree and populate itA simple test to see how we can build a tree and populate it
33. 安装自定义图标安装自定义图标
34. 建立了一棵树,定义图标建立了一棵树,定义图标
35. 在一个JTree显示分层数据在一个JTree显示分层数据
36. 添加和删除树节点和扩大树节点
37. 文件系统树
38. TreeExpansionListener和TreeExpansionEventTreeExpansionListener和TreeExpansionEvent
39. Enabling and Disabling Multiple Selections in a JTree Component
40. 只允许一个单一的节点被选中(默认)
41. Allow selection to span one vertical contiguous set of visible nodes
42. 允许多个节点选择
43. 设置行高JTree
44. 所有行15像素高度
45. 每一行行高单独计算
46. 清除内部缓存的行高
47. Preventing Expansion or Collapse of a Node in a JTree: override JTree.setExpandedState()
48. 从JTree组件删除节点
49. JTree root cannot be removed with removeNodeFromParent(), use DefaultTreeModel.setRoot() to remove the root
50. Listening for Expansion and Collapse Events in a JTree Component
51. Expansion and Collapse Events in a JTree are fired before a node is expanded or collapsed can be vetoed, thereby preventing the operation.
52. 创建JTree组件
53. Changing and Removing the Default Icons in a JTree Component
54. 使用UIManager更改默认图标JTree
55. 在JTree组件使用选定的节点
56. 遍历的所有节点JTree组件
57. 遍历所有节点树
58. 在JTree组件找到一个节点
59. Search backward from last visible row looking for any visible node whose name starts with prefix.
60. Find the path regardless of visibility that matches the specified sequence of names
61. 增加一个节点到JTree组件
62. 返回一个TreePath含有指定的节点。
63. Converting All Nodes in a JTree Component to a TreePath Array
64. Get path for all expanded or not expanded tree pathes
65. Expanding or Collapsing All Nodes in a JTree Component
66. Preventing the Expansion or Collapse of a Node in a JTree Component
67. 事件选择监听在JTree组件
68. 弹出菜单连接到JTree
69. 删除节点JTree
70. 添加编辑节点JTree
71. 搜索节点JTree
72. 拖放的一组文件到了一棵树
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.