2016-08-09 11 views
0

JComponentを他のJComponentにドラッグするか、ファイルをOSからJavaアプリケーションにドラッグする方法があります。JComponentにドラッグしてください。しかし、自分のアプリケーションの外側にあるjtreeのノードをディレクトリにドラッグしたいと思います。私のノードはファイルを表しているので、ドラッグされたディレクトリにそれらを保存します。スイングでJtreeからノードにノードをドラッグ

TransferHandlerを使用する方法を知っている人はいますか?

私は、ファイル(ノード)が自然に引きずられたものをパスに見つけることができませんpublic void exportDone(JComponent c, Transferable t, int action)方法は...

+1

* "ディレクトリに自分のアプリケーションの外。" *なぜ、別の 'JTree'にファイルシステムを表すものではありませ?ツリー内のファイルシステムを表すヒントについては、[File Browser GUI](http://codereview.stackexchange.com/q/4446/7784)を参照してください。 –

答えて

2

メソッドpublicボイドexportDone(JComponentのCを、譲渡トン、int型のアクションは)ありませんあなたはTransferHandler#createTransferable(JComponent c)メソッドを使用することができるかもしれません

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); 
    }); 
    } 
} 
関連する問題