2015-08-22 3 views
1

Я пытаюсь предотвратить перемещение курсора мыши (удерживать позицию курсора в центре приложения) и все еще иметь возможность обрабатывать событие mouseMoved, чтобы повернуть камеру в космос. Я попытался сделать это с помощью java.awt.Robot.mouseMove(int x, int y), но он вызывает событие mouseMoved, которое я использую для поворота камеры, поэтому камера возвращается к предыдущей позиции.Как захватить мышь в Java Swing?

+0

Вы можете просто сделать два оператора if: if (mouseX> centerX) 'и' else if (x

ответ

2

И если вы просто игнорируете mouseMoved-Events, вызываемые Robot?

Вы можете сохранить позицию, робот переместил мышь. Если вы получите Mouse-Event именно с этими координатами мыши, просто проигнорируйте это событие. Для меня что-то вроде этого работал:

import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JFrame; 

public class Test { 
    // position, where mouse should stay 
    private static final int fixX = 500; 
    private static final int fixY = 500; 

    private static Robot robo; 
    private static JFrame frame; 

    public static void main(String[] args) { 
     // create robot 
     try { 
      robo = new Robot(); 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 

     // create default frame with mouse listener 
     frame = new JFrame("test frame"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.addMouseMotionListener(new MouseMotionListener() { 
      @Override 
      public void mouseDragged(MouseEvent arg0) { 
       move(arg0); 
      } 

      @Override 
      public void mouseMoved(MouseEvent arg0) { 
       move(arg0); 
      } 
     }); 
     frame.setSize(1000, 1000); 
     frame.setVisible(true); 
    } 

    private static void move(MouseEvent arg0) { 
     // check, if action was thrown by robot 
     if (arg0.getX() == fixX && arg0.getY() == fixY) { 
      // ignore mouse action 
      return; 
     } 
     // move mouse to center (important: position relative to frame!) 
     robo.mouseMove(fixX + frame.getX(), fixY + frame.getY()); 

     // compute and print move position 
     int moveX = arg0.getX() - fixX; 
     int moveY = arg0.getY() - fixY; 
     System.out.println("moved: " + moveX + " " + moveY); 
    } 
} 

мышь остается на 500/500, вы получите ваши движения мыши, но вы иногда видите прыжки мыши, потому что робот не достаточно быстро.

Возможно, вы могли бы просто скрыть системный курсор (How to hide cursor in a Swing application?) и нарисовать свой собственный курсор.

+0

Спасибо, это решил мою проблему. И ваша ссылка также полезна для меня. – Dimansel

Смежные вопросы