概要

JTextFieldが初期状態や編集不可の場合などでドラッグ&ドロップをテストします。

サンプルコード

JTextField textField0 = new JTextField("Initially has BasicTextUI$TextTransferHandler");
#spanadd
textField0.setDragEnabled(true);
#spanend

JTextField textField1 = new JTextField("setEditable(false)");
#spanadd
textField1.setDragEnabled(true);
#spanend
textField1.setEditable(false);

JTextField textField2 = new JTextField("setEnabled(false)");
#spanadd
textField2.setDragEnabled(true);
#spanend
textField2.setEnabled(false);

JTextField textField3 = new JTextField("setTransferHandler(null)");
#spanadd
textField3.setDragEnabled(true);
#spanend
textField3.setTransferHandler(null);

JTextField textField4 = new JTextField("setDropTarget(null)");
#spanadd
textField4.setDragEnabled(true);
#spanend
textField4.setDropTarget(null);

JTextField textField5 = new JTextField("TransferHandler#canImport(...): false");
#spanadd
textField5.setDragEnabled(true);
#spanend
textField5.setTransferHandler(new TransferHandler() {
    @Override public boolean canImport(TransferSupport info) {
        return false;
    }
  @Override public boolean canImport(TransferSupport info) {
    return false;
  }
});
View in GitHub: Java, Kotlin

解説

  • Initially has BasicTextUI$TextTransferHandler
    • 初期状態で、BasicTextUI$TextTransferHandlerが設定されている
  • 0: Initially has BasicTextUI$TextTransferHandler
    • 初期状態でBasicTextUI$TextTransferHandlerが設定されている
      • このため、例えばワードパットなどから文字列をドラッグ&ドロップで移動(Ctrl+ドロップでコピー)可能
      • BasicTextUI$TextTransferHandlerはファイルなどのドロップには対応していない
    • JTextField#setDragEnabled(true)を設定しているので、他のJTextComponentや自分自身にドラッグ&ドロップで移動・コピーが可能
  • setEditable(false)
    • 初期状態で、BasicTextUI$TextTransferHandlerが設定されている
  • 1: setEditable(false)
    • 初期状態でBasicTextUI$TextTransferHandlerが設定されている
    • JTextField#setEditable(false)を設定した場合、ドロップ不可となる
    • JTextField#setEditable(false)かつJTextField#setDragEnabled(true)の場合、選択文字列を他のJTextComponentにドラッグ&ドロップでコピー可能
  • setEnabled(false)
    • 初期状態で、BasicTextUI$TextTransferHandlerが設定されている
    • JTextField#setEditable(false)かつJTextField#setDragEnabled(true)の場合、選択文字列を他のJTextComponentにドラッグ&ドロップでコピー可能(移動は不可)
  • 2: setEnabled(false)
    • 初期状態でBasicTextUI$TextTransferHandlerが設定されている
    • JTextField#setEnabled(false)で使用不可のコンポーネントにはドラッグ&ドロップ不可
    • JTextField#setDragEnabled(true)を設定しても選択自体が不可なのでドラッグが開始できない
  • setTransferHandler(null)
    • JTextField#setDragEnabled(true)を設定しても文字列選択不可なので、BasicTextUI$TextTransferHandlerではドラッグ自体が開始できない
  • 3: setTransferHandler(null)
    • JTextField#setTransferHandler(null)BasicTextUI$TextTransferHandlerを削除
    • 親コンポーネントのTransferHandlerが有効になる
      • このサンプルの場合は、JFrameに設定したダミーTransferHandler
  • setDropTarget(null)
    • このサンプルの場合は、JFrameに設定した仮のTransferHandler
  • 4: setDropTarget(null)
    • JTextField#setDropTarget(null)でこのコンポーネントに関連付けされたDropTargetをクリア
    • 親コンポーネントのDropTargetが有効になる
      • このサンプルの場合は、JFrameに設定したダミーTransferHandlerDropTarget
  • TransferHandler#canImport(...): false
    • このサンプルの場合は、JFrameに設定した仮のTransferHandlerDropTarget
  • 5: TransferHandler#canImport(...): false
    • TransferHandler#canImport(...)が常にfalseを返すTransferHandlerを設定
    • 親コンポーネントのTransferHandlerにドロップイベントは伝搬せず、常にドロップ不可
    • JTextField#setDragEnabled(true)を設定してもドラッグ開始できない
    • JTextField#setDragEnabled(true)を設定してもこのTransferHandlerではドラッグ開始できない

参考リンク

コメント