- ベストアンサー
JPanel上のマウスの座標の取得
JPanelに MouseMotionListenerをつけて、 マウスが動くたびに、 mouseMovedを呼び出して、マウスの座標を getX()と、getY() を使って、取得するようなプログラムを作ったのですが、 JPanel上にJLabelを何枚か配置しており、 マウスが、JLabelの上に来ると、mousuMovedが認識できません。 ちなみに、JLabelにもmouseMovedをつけると、 取得する座標が、JLabel上の座標になってしまいます。 JPanel上の座標をJLabelの上にマウスが来ても正確に取得するにはどうしたらいいでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
// 一応自分で計算しなくてもそういうの用意されているみたいね。 // http://download.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#convertPoint%28java.awt.Component,%20int,%20int,%20java.awt.Component%29 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Hello extends JFrame implements MouseMotionListener{ public Hello(){ JLabel label1 = new JLabel("Hello, World!"); label1.setBackground(java.awt.Color.GREEN); label1.setOpaque(true); JLabel label2 = new JLabel("Hello, World!"); label2.setBackground(java.awt.Color.RED); label2.setOpaque(true); label2.addMouseMotionListener(this); setLayout(new GridLayout(1, 2)); getContentPane().add(label1); getContentPane().add(label2); setSize(300, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); setLocationRelativeTo(null); } public void mouseDragged(MouseEvent e){ } public void mouseMoved(MouseEvent e){ setTitle(Double.toString(SwingUtilities.convertPoint((Component)e.getSource(), e.getX(), e.getY() ,this ).getX())); } public static void main(String[] args) { Hello h1 = new Hello(); h1.setVisible(true); } }
その他の回答 (1)
>ちなみに、JLabelにもmouseMovedをつけると、 >取得する座標が、JLabel上の座標になってしまいます。 JLabelの位置はわかるのですから、取得した座標に加算すればいいだけではないでしょうか。 あるいは、JPanelだけですべて処理したいのであれば、JLabelを使わず、すべてグラフィックとして描画し処理する、という形になるでしょう。JLabelを使っている理由が、単純にテキストを表示するだけということなら、描画に置き換えてもそれほど大変ではないように思えます。
お礼
回答いただきありがとうございます。
お礼
回答ありがとうございます。 convertPointという機能を使うということですね。 大変有効な方法です。