18209


`TransferHandler`でドラッグ＆ドロップを取得できるのはいいのですが、  
どのオブジェクトにドロップされたかを取得する方法はありますか？  
現在は次のような感じのコードなのですが、各`JTextField`のどれにファイルがドロップされたかを判別したいのです。  
(ファイル名自体は取得できるものの、どのオブジェクトにドロップされたか分からないと`JTextField`に反映できないので)

[code]

    class hoge{
        JTextField[] file_text_field;
        // コンストラクタ
        hoge{
            file_text_field = new JTextField[n];
            for(int k = 0; k < n; k++){
                file_text_field[k] = new JTextField();
                file_text_field[k].setTransferHandler(new DropFileHandler());
            }
        }
        // ドロップ用のクラス
        class DropFileHandler extends TransferHandler{
            @Override
            public boolean canImport(TransferSupport support){
                // ドロップされていない場合は受け取らない
                if(!support.isDrop()) return false;
                // ドロップされたものがファイルではない場合は受け取らない
                if(!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) return false;
                return true;
            }
            @Override
            public boolean importData(TransferSupport support){
                // 受け取っていいものか確認する
                if(!canImport(support)) return false;
                // ドロップ処理
                Transferable transferable = support.getTransferable();
                try{
                    // ファイルを受け取る
                    List<File> files = (List<File>)transferable.getTransferData(DataFlavor.javaFileListFlavor);
                    // リストに追加する
                    for(File file : files){
                        System.out.println(file.toString());
                    }
                }catch(Exception error){
                    error.printStackTrace();
                }
                return true;
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2015-10-29T11:51:32.987
18206
2015-10-29T13:46:37.817
2015-10-29T13:46:37.817
46
12939
question
java swing
Javaでドラッグ＆ドロップする際に、ドロップ位置を把握したいのですが……


> 各TextFieldのどれにファイルがドロップされたかを判別したいのです。

[TransferHandler.TransferSupport#getComponent()](http://docs.oracle.com/javase/jp/8/docs/api/javax/swing/TransferHandler.TransferSupport.html#getComponent--)メソッドで、転送のターゲット・コンポーネントを取得することができます。

[code]

    import java.awt.*;
    import java.awt.datatransfer.*;
    import java.io.*;
    import java.util.Objects;
    import java.util.List;
    import javax.swing.*;
    
    public class Hoge2 {
      public JComponent makeUI() {
        int n = 4;
        JPanel p = new JPanel(new GridLayout(n, 0, 5, 5));
        JTextField[] file_text_field = new JTextField[n];
        for (int k = 0; k < n; k++) {
          file_text_field[k] = new JTextField();
          file_text_field[k].setTransferHandler(new DropFileHandler());
          p.add(file_text_field[k]);
        }
        JPanel pp = new JPanel(new BorderLayout());
        pp.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
        pp.add(p, BorderLayout.NORTH);
        return pp;
      }
      public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
          @Override public void run() {
            createAndShowGUI();
          }
        });
      }
      public static void createAndShowGUI() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(new Hoge2().makeUI());
        f.setSize(320, 240);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
      }
    }
    
    // ドロップ用のクラス
    class DropFileHandler extends TransferHandler {
      @Override
      public boolean canImport(TransferSupport support) {
        // ドロップされていない場合は受け取らない
        if (!support.isDrop()) return false;
        // ドロップされたものがファイルではない場合は受け取らない
        if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) return false;
        return true;
      }
      @Override
      public boolean importData(TransferSupport support) {
        // 受け取っていいものか確認する
        if (!canImport(support)) return false;
        // ドロップ処理
        Transferable transferable = support.getTransferable();
    
        JTextField textField = (JTextField) support.getComponent();
        try {
          // ファイルを受け取る
          @SuppressWarnings("unchecked")
          List<File> files = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
          // リストに追加する
          for (File file : files) {
            System.out.println(file.toString());
          }
          textField.setText(Objects.toString(files.get(0), ""));
        } catch (Exception error) {
          error.printStackTrace();
        }
        return true;
      }
    }
    
[/code]


CC BY-SA 3.0
2015-10-29T13:17:31.387
18209
2015-10-29T13:17:31.387
46
18206
answer