ホームページ  >  記事  >  Java  >  JLabel マウス イベントをオーバーライドして、ドラッグ アンド ドロップ中のイベントの消費を防ぐにはどうすればよいですか?

JLabel マウス イベントをオーバーライドして、ドラッグ アンド ドロップ中のイベントの消費を防ぐにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-24 04:50:31819ブラウズ

How to Override JLabel Mouse Events to Prevent Event Consumption During Drag and Drop?

ドラッグ アンド ドロップの JLabel マウス イベント

マウス イベントをオーバーライドすることで、JLabel 上にドラッグ アンド ドロップ機能を実装できます。ただし、mousePressed イベントでドラッグ アンド ドロップを定義するときに問題が発生します。同じ JLabel でマウスリリース イベントがトリガーされなくなるためです。

実装:

<code class="java">Thumbnails[I_Loop].setText("1");
Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text"));
Thumbnails[I_Loop].addMouseListener(new MouseAdapter() {
    public void  mouseReleased(MouseEvent me) {
           System.out.println("here mouse released");
      }
    public void mousePressed(MouseEvent me) {
        System.out.println("here mouse pressed");
        JComponent comp = (JComponent) me.getSource();
        TransferHandler handler = comp.getTransferHandler();
        handler.exportAsDrag(comp, me, TransferHandler.COPY);
    }
});</code>

この例では、 MousePressed イベントはドラッグ アンド ドロップ プロセスを開始するために使用されますが、このイベントはマウス イベントを消費するため、mouserelease イベントがトリガーされなくなります。その結果、「ここでマウスを離しました」というメッセージは出力されません。

代替アプローチ:

1. TransferHandler の使用:

@Thomas が述べたように、TransferHandler はドラッグ アンド ドロップ操作に使用できます。ドラッグ プロセスを開始するための、exportAsDrag() などのメソッドが提供されます。

2. MouseMotionListener の使用:

このアプローチは、マウスの押下イベントや離したイベントに依存するのではなく、マウス ドラッグ イベントをリッスンしてコンポーネントを移動します。

3. JLayeredPane の使用:

マウス イベントを使用してコンポーネントを JLayeredPane 上にドラッグできます。詳細については、リンクされたスタック オーバーフローの例を参照してください。

改善されたコード:

<code class="java">Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text"));
Thumbnails[I_Loop].addMouseListener(new MouseAdapter() {
    public void  mouseReleased(MouseEvent me) {
           System.out.println("here mouse released");
      }
});
Thumbnails[I_Loop].addMouseMotionListener(new MouseMotionAdapter() {
    @Override
    public void mouseDragged(MouseEvent e) {
        int dx = e.getX() - mousePt.x;
        int dy = e.getY() - mousePt.y;
        Thumbnails[I_Loop].setBounds(Thumbnails[I_Loop].getX() + dx, Thumbnails[I_Loop].getY() + dy, Thumbnails[I_Loop].getWidth(), Thumbnails[I_Loop].getHeight());
    }
});</code>

この実装では、MouseMotionListener を使用してマウス ドラッグ イベントを処理し、それに応じて JLabel の位置を更新します。これで、mouseReleased イベントがトリガーされ、「マウスが解放されました」というメッセージが出力されます。

以上がJLabel マウス イベントをオーバーライドして、ドラッグ アンド ドロップ中のイベントの消費を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。