ネイティヴからjava/swing(awt)へのドラッグ&ドロップ

  • このエントリーをはてなブックマークに追加
  • Pocket

java/swing(awt)のドラッグ&ドロップについて。
ネイティヴからファイルリストをドラッグし、javaアプリの方へドロップされたとき、Fileインスタンスのリストのイテレータを得るために私は以下のようにしています。
windowsでもlinux(Gnome,kde)のどちらの環境でも動くように、二つのMIME typeを処理します。

    DataFlavor uriFlavor;
    {
        try{
            uriFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }
    private Iterator getIterator(DropTargetDropEvent e){
        try{
            //ファイルリストのとき
            if(e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){

                e.acceptDrop(DnDConstants.ACTION_COPY);
                List files = (List)e.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
                return files.iterator();
            }
            //text/uri-listだったとき
            else if(e.isDataFlavorSupported(uriFlavor)){
                e.acceptDrop(DnDConstants.ACTION_COPY);
                String str = (String)e.getTransferable().getTransferData(uriFlavor);
                StringTokenizer st = new StringTokenizer(str, "\r\n");
                //Generics : java v1.5
                Vector<File> vec = new Vector<File>();

                //uri-listの中でfileパスがあったらvectorへ格納する
                java.net.URI uri;
                while(st.hasMoreElements()){
                    try{
                        uri = new java.net.URI((String)st.nextElement());
                        if(uri.getScheme().equals("file")){
                            vec.add(new File(uri.getPath()));
                        }
                    }catch(java.net.URISyntaxException ex){ }
                }
                return vec.iterator();
            }
            else{
                return null;
            }
        }catch(UnsupportedFlavorException ex){
            return null;
        }catch(IOException ex){
            return null;
        }
    }
  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す