Java Swing サンプル集

Top Page
* ドラッグ&ドロップ
-
・説明1
-

ドラッグ&ドロップには対象、ドラッグ先などにより方法が数パターン存在します。

コード例1は、各コンポーネントに存在するメソッドsetDragEnabled()でtrueを指定する、という最も簡単な方法。

ただしこの方法の場合、コンポーネントによりドラッグ可能な物が異なります。
JTextFieldやJTextAreaの場合はプレーンテキストのみ受け付けます。
エクスプローラ等からのファイルリストは受け付けません。
しかも、JLabelにはsetDragEnabled()メソッド自体存在しません。

・コード例1
-

jtextfield.setDragEnabled(true);
・説明2
-

JLabel、JTextField、JTextAreaで共通してエクスプローラ等からファイルリストのドラッグ&ドロップを受け付けるためには、以下のように実装します。

  1. DropTargetListenerを実装した(またはDropTargetAdapterを継承した)クラスを定義する。
  2. 上記クラス内drop()メソッドをオーバーライドする。
    (このメソッドは何かがドロップされた際に呼び出される。)
  3. drop()メソッド内でドロップされたものがファイルリストの場合のみ処理を行う、という判定分を入れる。 具体例としては、
      if (transfer.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                                                    これがファイルリストを示す
      
          ・・・
      }
    
    ここでは DataFlavor.javaFileListFlavor がファイルリストを示しているが、同様にイメージファイル(*.gifなど)のみを受け付けるようにすることも出来る。
  4. 上記if文内でドロップを受け付ける。
      e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
      
    このあとに行いたい処理を実装する。
  5. アプリの初期化処理内等で上記で定義したドロップターゲットを設定する。
      DropTarget target = new DropTarget(component, new SampleDropTargetAdapter());
    
      ※上記1行は以下と同等
      
      try {
          DropTarget target = new DropTarget();
          target.addDropTargetListener(new SampleDropTargetAdapter());
          component.setDropTarget(target);
      }
      catch(TooManyListenersException tmle) {
          tmle.printStackTrace();
      }
・コード例2
-

    private void initialize() {
        ・・・・
        DropTarget target = new DropTarget(jTextArea, new SampleDropTargetAdapter());
    }

    private class SampleDropTargetAdapter extends DropTargetAdapter {
        
        public void drop(DropTargetDropEvent e) {
            try {
                Transferable transfer = e.getTransferable();
                // ファイルリストの転送を受け付ける
                if (transfer.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                    // copyとmoveを受け付ける
                    e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                    // ドラッグ&ドロップされたファイルのリストを取得
                    java.util.List fileList =
                        (List) transfer.getTransferData(DataFlavor.javaFileListFlavor);
                    // 取得したファイルの名称を表示
                    Iterator iterator = fileList.iterator();
                    while(iterator.hasNext()) {
                        getJTextArea().append(((File)iterator.next()).getName() + "\n");
                    }
                }
            } catch (UnsupportedFlavorException e1) {
                e1.printStackTrace();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
    }
サンプルソース : src_drag_and_drop.zip
サンプルアプリ : sample_drag_and_drop.jar

inserted by FC2 system