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

Susan Sarandon
リリース: 2024-10-24 04:50:31
オリジナル
824 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!