2016-08-09 31 views
0

我已經閱讀並找到了很多方法將JComponent s拖拽到其他JComponent上,或者將文件拖拽到我的JComponent上,從操作系統到Java應用程序。不過,我想將我的應用程序外部的jtree節點拖到目錄中。我的節點代表文件,所以我想將它們保存在拖動的目錄中。將Jtree中的節點拖拽到操作系統中

有沒有人知道使用TransferHandler這樣做的方法?

public void exportDone(JComponent c, Transferable t, int action)不允許我找出來成什麼路徑的文件(節點)很自然地拖動的方法...

+1

* 「我的應用程序外到目錄中。」 *爲什麼不能代表另一個'JTree'文件系統?有關在樹中表示文件系統的提示,請參見[文件瀏覽器GUI](http://codereview.stackexchange.com/q/4446/7784)。 –

回答

2

的方法public void exportDone(JComponent的C,可轉讓T,INT動作)做不能讓我找出成什麼路徑的文件(節點)很自然地拖動......

import java.awt.*; 
import java.awt.datatransfer.*; 
import java.io.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.tree.*; 

public class TreeDragAndDropTest { 
    public JComponent makeUI() { 
    JTree tree = new JTree(); 
    tree.getSelectionModel().setSelectionMode(
     TreeSelectionModel.SINGLE_TREE_SELECTION); 
    tree.setDragEnabled(true); 
    tree.setTransferHandler(new TransferHandler() { 
     private File f; 
     @Override public int getSourceActions(JComponent c) { 
     return COPY; 
     } 
     @Override protected Transferable createTransferable(JComponent c) { 
     TreePath p = ((JTree) c).getSelectionPath(); 
     DefaultMutableTreeNode n = (DefaultMutableTreeNode) p.getLastPathComponent(); 
     try { 
      f = File.createTempFile(Objects.toString(n.getUserObject()) + "_", ".tmp"); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     if (Objects.nonNull(f)) { 
      return new Transferable() { 
      @Override public Object getTransferData(DataFlavor flavor) { 
       return Arrays.asList(f); 
      } 
      @Override public DataFlavor[] getTransferDataFlavors() { 
       return new DataFlavor[] { DataFlavor.javaFileListFlavor }; 
      } 
      @Override public boolean isDataFlavorSupported(DataFlavor flavor) { 
       return flavor.equals(DataFlavor.javaFileListFlavor); 
      } 
      }; 
     } else { 
      return null; 
     } 
     } 
     @Override protected void exportDone(JComponent c, Transferable d, int a) { 
     if (Objects.nonNull(f)) { 
      f.delete(); 
     } 
     } 
    }); 
    JPanel p = new JPanel(new BorderLayout()); 
    p.add(new JScrollPane(tree)); 
    return p; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new TreeDragAndDropTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
相關問題