Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JTableでのDrag&Dropについて

いつも参考にさせて貰っております。

質問させて頂きたいのですが、JTableを継承したクラス
でShiftキーを押しながらセルを選択した際Dragが出来
ないのですが、何か良い方法はありますでしょうか?Ctrlキーで複数選択した場合はDrag出来ます。dragGestureRecognizedさえ動作してくれればなんとか
なるのですが。

上記が不明な場合、JTableのセルをShiftで複数選択し
た場合とCtrlで複数選択した場合で内部的になにか差異があるのか教えて頂ければ助かります。

よろしくお願いします。

↓一応ソースを貼り付けます
public class DragTable extends JTable implements Transferable, DragGestureListener /*, KeyListener*/ {

  /**
   * コンストラクタ
   */
  public DragTable(){
    super();

    // ドラッグソースからドラッグを認識してくれる人を作る。
    DragSource dragSource = new DragSource();
    DragGestureRecognizer dgr = dragSource.createDefaultDragGestureRecognizer(
        this,
        DnDConstants.ACTION_COPY,
        this);
    
  }
  // データの中身をTransferインターフェースを介して渡す。
  public Object getTransferData(DataFlavor flavor) {
    return "hoge";
  }

  public DataFlavor[] getTransferDataFlavors() {
      return new DataFlavor[] {DataFlavor.stringFlavor};  // 今のところ文字列だけ
  }
  public boolean isDataFlavorSupported(DataFlavor flavor) {
      return flavor.equals(DataFlavor.stringFlavor);
  }
  // ドラッグのジェスチャが認識された。
  public void dragGestureRecognized(DragGestureEvent e) {
      System.out.println("From.dragGestureRecognized()\n "+e);
      // Copy/Moveのアクションならドラッグを開始する
      if((e.getDragAction()|DnDConstants.ACTION_COPY_OR_MOVE)!=0) {
          e.startDrag(DragSource.DefaultCopyDrop, this, null);
      }
  }
}

1

回答

2907

閲覧

1件の回答

評価

0

環境が明記されていませんが、「Shiftキーを押しながらセルを選択した」場合と「Ctrlキーで複数選択した場合」の差異ですが、選択モデルのリード、アンカー、変更される選択範囲が異なります。

ただし処理するメソッドに差異はありません。キーボード操作、マウス操作による選択変更は、最終的にJTable#changeSelection()が呼び出されます。
詳細はソースを読んでください。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。