マウス イベントをオーバーライドすることで、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 サイトの他の関連記事を参照してください。