import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.MenuComponent;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
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.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;import javax.swing.AbstractButton;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;
import javax.swing.tree.TreePath;public class CopyFileWizard extends Panel{ /**
 * 
 */
private static final long serialVersionUID = 1L;


private FileTree updateFileTree;
private FileTree deleteFileTree;



public CopyFileWizard() {
super();
init();
}
private void init() {
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

JPanel updatePanel = new JPanel();
updatePanel.setLayout(new BoxLayout(updatePanel, BoxLayout.Y_AXIS));

updatePanel.add(new JLabel("需要更新的文件"));

updateFileTree=this.createUpdateFileTree();

JScrollPane scrollPane = new JScrollPane(updateFileTree);
        scrollPane.getVerticalScrollBar().setUnitIncrement(10);
        updatePanel.add(scrollPane);
        updatePanel.add(Box.createRigidArea(new Dimension(10, 1)));

JPanel deletePanel = new JPanel();
deletePanel.setLayout(new BoxLayout(deletePanel, BoxLayout.Y_AXIS));
deletePanel.add(new JLabel("需要删除的文件"));

this.deleteFileTree=this.createUpdateFileTree();

scrollPane = new JScrollPane(deleteFileTree);
        scrollPane.getVerticalScrollBar().setUnitIncrement(10);
        deletePanel.add(scrollPane);
        deletePanel.add(Box.createRigidArea(new Dimension(10, 1)));

this.add(updatePanel);
this.add(Box.createRigidArea(new Dimension(15, 1)));
this.add(deletePanel);

}
private FileTree createUpdateFileTree() {
FileTree fileTree=new FileTree();
return fileTree;
}
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());

CopyFileWizard copyFileWizard=new CopyFileWizard();
frame.add(copyFileWizard);
frame.setSize(new Dimension(900, 600));
frame.setVisible(true);
}
}

解决方案 »

  1.   

    class FileTree extends JTree implements DragGestureListener,  
    DragSourceListener, DropTargetListener {
    private static final long serialVersionUID = 1L;
     private Point lastPoint = new Point(); 
     private TreePath lastPath;
     private JPopupMenu popup;
     public FileTree() {
    super();
    new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this);

    setModel(createTreeModel());
    this.addTreeWillExpandListener(new TreeWillExpandListener() {

    public void treeWillExpand(TreeExpansionEvent e)
    throws ExpandVetoException {
     TreePath path = e.getPath();  
      
                    if (path != null) {  
                        FileNode node = (FileNode) path.getLastPathComponent();  
                            DefaultTreeModel model = (DefaultTreeModel) getModel();                       if (!node.isExplored()) {  
                            node.explore();  
                         //   model.nodeStructureChanged(node); 
                          
                        }  
                      //  model.reload(node);
                        
                    }

    }

    public void treeWillCollapse(TreeExpansionEvent event)
    throws ExpandVetoException {


    }
    });

    addTreeExpansionListener(new TreeExpansionListener() {  
                public void treeCollapsed(TreeExpansionEvent e) {  
                }  
      
                public void treeExpanded(TreeExpansionEvent e) {              }  
            });  


    setCellRenderer(new DefaultTreeCellRenderer() {  
      
                private static final long serialVersionUID = 7616415055309322562L;  
      
                public Component getTreeCellRendererComponent(JTree tree,  
                        Object value, boolean selected, boolean expanded,  
                        boolean leaf, int row, boolean hasFocus) {  
                    TreePath tp = tree.getPathForRow(row);  
                    if (tp != null) {  
                        FileNode node = (FileNode) tp.getLastPathComponent();  
                        File f = node.getFile();  
                        try {  
                            Icon icon = FileSystemView.getFileSystemView()  
                                    .getSystemIcon(f);  
                            this.setIcon(icon);  
                            this.setLeafIcon(icon);  
                            this.setOpenIcon(icon);  
                            this.setClosedIcon(icon);  
                            this.setDisabledIcon(icon);  
                        } catch (Exception e) {  
                            e.printStackTrace();  
                        }  
                    }  
                    return super.getTreeCellRendererComponent(tree, value,  
                            selected, expanded, leaf, row, hasFocus);  
                }  
      
            });  
      
            super.setScrollsOnExpand(true);


            this.addKeyListener(new KeyAdapter() {  
               
                public void keyPressed(KeyEvent e) {  
                    int code = e.getKeyCode();  
                    int modifiers = e.getModifiers();  
                    if (code == 'v' || code == 'V') {  
                        System.out.println("find v");  
                        System.out.println("modifiers:" + modifiers + "\t"  
                                + ((modifiers & KeyEvent.CTRL_MASK) != 0));  
                    }  
      
                    if ((modifiers & KeyEvent.CTRL_MASK) != 0  
                            && (code == 'v' || code == 'V')) {  
                        Transferable tr = Toolkit.getDefaultToolkit()  
                                .getSystemClipboard().getContents(null);  
      
                        
                        
                        TreePath path = getSelectionPath();  
                        if (path == null) {  
                            return;  
                        }  
                        FileNode node = (FileNode) path.getLastPathComponent();  
                        if (node.isDirectory()) {  
                            System.out.println("file cp");  
                            try {  
                                List<?> list = (List<?>) (tr  
                                        .getTransferData(DataFlavor.javaFileListFlavor));  
                                Iterator<?> iterator = list.iterator();  
                                File parent = node.getFile();  
                                while (iterator.hasNext()) {  
                                    File f = (File) iterator.next();  
                                    cp(f, new File(parent, f.getName()));  
                                }  
                                node.reexplore();  
                            } catch (Exception ioe) {  
                                ioe.printStackTrace();  
                            }  
                            updateUI();  
                        }  
                    }  
                }  
      
            });  


            this.addMouseListener(new MouseAdapter(){
            
            
    @Override
    public void mousePressed(MouseEvent e) {
    showPopup(e);
    } @Override
    public void mouseReleased(MouseEvent e) {
    showPopup(e);
    }
    private void showPopup(MouseEvent e){

    popup = new JPopupMenu();
        JMenuItem menuItem = new JMenuItem("删除");
        menuItem.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {


    }
    });
       
        popup.add(menuItem);
    if(e.isPopupTrigger()){
      popup.show(e.getComponent(),e.getX(),e.getY());
    }
    System.out.println(popup.isVisible());
    }
    });
            
      
            
            
            

    }  private void cp(File src, File dest) throws IOException {  
            if (src.isDirectory()) {  
                if (!dest.exists()) {  
                    boolean ret = dest.mkdir();  
                    if (ret == false)  
                        return;  
                }  
                File[] fs = src.listFiles();  
                for (int i = 0; i < fs.length; i++) {  
                    cp(fs[i], new File(dest, fs[i].getName()));  
                }  
                return;  
            }  
            byte[] buf = new byte[1024];  
            FileInputStream in = new FileInputStream(src);  
            FileOutputStream out = new FileOutputStream(dest);  
            int len;  
            try {  
                while ((len = in.read(buf)) > 0) {  
                    out.write(buf, 0, len);  
                }  
            } finally {  
                in.close();  
                out.close();  
            }  
        }  
     
    private DefaultTreeModel createTreeModel() {  
            File root = FileSystemView.getFileSystemView().getRoots()[0];  
            FileNode rootNode = new FileNode(root);  
      
            rootNode.explore();  
            return new DefaultTreeModel(rootNode);  
        }  







    ////////////////////////////////////////
    public void dragEnter(DropTargetDragEvent dtde) {
    // TODO Auto-generated method stub

    } public void dragOver(DropTargetDragEvent dtde) {

    Point pt = dtde.getLocation();  
            if (pt.equals(lastPoint)) {  
                return;  
            }  else{
             lastPoint=pt;
            }
            
            TreePath path = getClosestPathForLocation(pt.x, pt.y);  
           
            TreePath temp=lastPath;
            
    if (!(path == lastPath)) {  
                lastPath = path; 
               this.setSelectionPath(lastPath);
              if(lastPath.getParentPath()!=temp){
               this.collapsePath(temp);
              }
               
            }  else{
             this.expandPath(lastPath);
            
            }
            
            

    } public void dropActionChanged(DropTargetDragEvent dtde) {
    // TODO Auto-generated method stub

    } public void dragExit(DropTargetEvent dte) {
    // TODO Auto-generated method stub

    } public void drop(DropTargetDropEvent dtde) {
     try { 
     DataFlavor stringFlavor = DataFlavor.stringFlavor;  
            
             if(this.lastPath==null){
              return;
             }
             
             FileNode node = (FileNode) this.lastPath.getLastPathComponent();  
             if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)  
                     && node.isDirectory()) {  
              dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);  
                 System.out.println("file cp");  
                 List<?> list = (List<?>) (dtde.getTransferable()  
                         .getTransferData(DataFlavor.javaFileListFlavor));  
                 Iterator<?> iterator = list.iterator();  
                 File parent = node.getFile();  
                 while (iterator.hasNext()) {  
                     File f = (File) iterator.next();  
                     cp(f, new File(parent, f.getName()));  
                 }  
                 node.reexplore();  
                 dtde.dropComplete(true);  
                 this.updateUI();  
             }else{
              dtde.rejectDrop();
             }
     }catch (IOException ioe) {  
                ioe.printStackTrace();  
            } catch (UnsupportedFlavorException ufe) {  
                ufe.printStackTrace();  
            } finally {  
              
                this.repaint();  
            }  
             
             

    }
    ///////////////////////////////
    public void dragEnter(DragSourceDragEvent dsde) {
    // TODO Auto-generated method stub

    } public void dragOver(DragSourceDragEvent dsde) {
    // TODO Auto-generated method stub

    } public void dropActionChanged(DragSourceDragEvent dsde) {
    // TODO Auto-generated method stub

    } public void dragExit(DragSourceEvent dse) {
    // TODO Auto-generated method stub

    } public void dragDropEnd(DragSourceDropEvent dsde) {
    // TODO Auto-generated method stub

    }
    //////////////////////////////////
    public void dragGestureRecognized(DragGestureEvent dge) {
    // TODO Auto-generated method stub

    }

    }
      

  2.   

    class FileNode extends DefaultMutableTreeNode {  
        private static final long serialVersionUID = -6713369593920467035L;  
        private boolean explored = false;  
      
        public FileNode(File file) {  
            setUserObject(file);  
        }  
      
        public boolean getAllowsChildren() {  
            return isDirectory();  
        }  
      
        public boolean isLeaf() {  
            return !isDirectory();  
        }  
      
        public File getFile() {  
            return (File) getUserObject();  
        }  
      
        public boolean isExplored() {  
            return explored;  
        }  
      
        public boolean isDirectory() {  
            File file = getFile();  
            return file.isDirectory();  
        }  
      
        public String toString() {  
            File file = (File) getUserObject();  
            String filename = file.toString();  
            int index = filename.lastIndexOf(File.separator);  
      
            return (index != -1 && index != filename.length() - 1) ? filename  
                    .substring(index + 1) : filename;  
        }  
      
        public void explore() {  
            if (!isDirectory())  
                return;  
      
            if (!isExplored()) {  
                File file = getFile();  
                File[] children = file.listFiles();  
      
                for (int i = 0; i < children.length; ++i) {  
                    if (children[i].isDirectory())  
                        add(new FileNode(children[i])); 
                }  
                for (int i = 0; i < children.length; ++i) {  
                    if (!children[i].isDirectory())  
                        add(new FileNode(children[i]));  
                }  
              
                explored = true;  
            }  
        }  
      
        public void reexplore() {  
            this.removeAllChildren();  
            explored = false;  
            explore();  
        }  
    }