TITLE:JFrameの外にあるMouseの位置を取得する

JFrameの外にあるMouseの位置を取得する

編集者:Terai Atsuhiro~

作成日:2007-10-29
更新日:2021-12-02 (木) 11:12:43
  • category: swing folder: MouseInfo title: Screen上にあるMouseの位置を取得する tags: [MouseInfo, Timer] author: aterai pubdate: 2007-10-29T13:39:49+09:00 description: Screen上にあるMouseの絶対位置を取得して、パネル内のラケットを移動します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTQC6wobCI/AAAAAAAAAe8/3UnK314olDM/s800/MouseInfo.png

概要

Screen上にあるMouseの絶対位置を取得して、パネル内のラケットを移動します。

概要

JFrameの外にあるMouseの絶対位置を取得して、パネル内のラケットを移動します。

#screenshot

サンプルコード

#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
public static final Dimension panelDim = new Dimension(320, 240);
private final Racket racket = new Racket(panelDim);
#spanadd

#spanend
public MainPanel() {
    super(new BorderLayout());
    setPreferredSize(panelDim);
    new javax.swing.Timer(10, this).start();
  super(new BorderLayout());
  setPreferredSize(panelDim);
  new Timer(10, this).start();
}
#spandel
@Override
#spanend
#spandel
public void paintComponent(Graphics g) {
#spanend
    super.paintComponent(g);
    racket.draw(g);
#spanadd

#spanend
#spanadd
@Override protected void paintComponent(Graphics g) {
#spanend
  super.paintComponent(g);
  racket.draw(g);
}
#spandel
//@Override
#spanend
#spandel
public void actionPerformed(ActionEvent e) {
#spanend
    PointerInfo pi = MouseInfo.getPointerInfo();
    Point pt = pi.getLocation();
    SwingUtilities.convertPointFromScreen(pt, this);
    racket.move(pt.x);
    repaint();
#spanadd

#spanend
#spanadd
@Override public void actionPerformed(ActionEvent e) {
#spanend
  PointerInfo pi = MouseInfo.getPointerInfo();
  Point pt = pi.getLocation();
  SwingUtilities.convertPointFromScreen(pt, this);
  racket.move(pt.x);
  repaint();
}
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、以下の手順でラケットを動かしています。
  1. 10ミリ秒ごとにMouseInfoからPointerInfoを取得
  2. PointerInfoから画面上でのポインタ座標を取得
  3. SwingUtilities.convertPointFromScreenメソッドで、パネル相対のポインタ座標に変換
  4. ラケットに変換した座標を与えて、repaint

解説

上記のサンプルでは、マウスカーソルがパネル外に移動した場合でもラケットを動かせるように、以下のような方法を使用しています。

参考リンク

  1. Timerを使用して10ミリ秒ごとにMouseInfoからPointerInfoを取得
  2. PointerInfoから画面上でのポインタ座標を取得
  3. SwingUtilities.convertPointFromScreen(...)メソッドでこれをパネル相対の座標に変換
  4. ラケットに変換した座標を与えてJPanel#repaint()メソッドで再描画

コメント

参考リンク

コメント