2

アプリケーションにドラッグ アンド ドロップ機能を追加しようとしています。これにより、ドラッグ イベントの発信元はJTable. 私は現在、組み込みのドラッグ サポートJTableオファーを呼び出して使用していますsetDragEnabled(true)

私が直面している問題は、ドラッグ操作を開始するには、最初にテーブルの行をクリックしてからマウスを離す必要があることです。ドラッグ イベントを生成するのは、マウスを2 回押したとき (およびそれ以降のすべてのマウスを押したとき) だけです。JTableこれは、がフォーカスを失った場合でも発生します。つまり、最初の左クリック操作が実行されると、新しい にスワップするまでTableModel、ドラッグ アンド ドロップは完全に機能します。新しいモデルがインストールされたら、ドラッグが再び機能し始める前に、テーブルを左クリックする必要があります。

含意について API ドキュメントを読むsetDragEnabled(boolean)と、これは L&F の責任であり、これを解決するために私にできることは何もないかもしれません。誰か提案はありますか?アロイ L&F を使用していますが、変更するのは気が進まないでしょう。

4

3 に答える 3

2

MouseListenerマウスが押されたときに aをに追加し、 r のメソッドにJTableフックするというハックな解決策を発見しました。TransferHandleexportAsDrag

    final JTable actionTbl = new JTable();
    actionTbl.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent evt) {
            // Need to explicitly start a drag operation when the mouse is pressed.
            // Otherwise drags are only started *after* the user has clicked once
            // on the JTable (this could be down to the L&F not doing the right thing).
            actionTbl.getTransferHandler().exportAsDrag(actionTbl, evt, TransferHandler.COPY);
        }
    });
于 2012-07-27T19:10:57.367 に答える
1

setDragEnabledメソッドのjavadocからの引用

自動ドラッグ処理が有効になっている場合、ほとんどのルック アンド フィール (サブクラスの BasicLookAndFeel を含む) は、ユーザーが項目 (単一選択モードの場合) または選択 (他の選択モードの場合) の上でマウス ボタンを押すと、ドラッグ アンド ドロップ操作を開始します。次に、マウスを数ピクセル移動します。

これを正しく読めば、単一選択モードを使用したときに目的の動作が得られるはずです。

その動作を複数選択と組み合わせる必要がある場合は、テーブルで受信したマウス イベントを手動で処理し、mouse_down で選択を調整してから、マウス イベントを に委譲することができますJTable。したがって、擬似コードでは:

protected void processEvent(AWTEvent e) {
  if ( isMouseDownEvent( e ) ){
     adjustSelection( e );
  }
  super.processEvent( e );
}

注:私はこれをテストしていません。JTableこれは、私が javadoc で読んだ内容のみに基づいており、それ自体がイベントを処理して反応するため、望ましくない副作用が生じる可能性があります。

于 2012-07-27T16:29:38.423 に答える
0

Adamski のソリューションは非常にうまく機能しますが、機能させるTransferHandler.COPYには最後の行をTransferHandler.MOVE次のように変更する必要がありました。

final JTable actionTbl = new JTable();
actionTbl.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent evt) {
        actionTbl.getTransferHandler().exportAsDrag(actionTbl, evt, TransferHandler.MOVE);
    }
});
于 2016-02-03T15:53:51.773 に答える