Hi all, I am looking for a way to capture or trap the mouse in a window after it has entered that window much like a mouse is trapped in a virtual machine window until a user presses CTRL+ALT+DEL or release the mouse in some other manner. How do I make this happen in Java? Going full screen is not an option.
EDIT:
Here is some SSCCE for ya. This code will trap your mouse in the window. To get out you just have to within the generated frame and move directly to the close button. If you will notice when your mouse tries to leave it automatically goes back to (0,0). What I need to know is how do I get it to go back to the coordinates where it exited from. I tried getX() and getY() in place of (0,0) but the robot does not return the mouse there (I think the response time is to slow). I also have had the robot move the mouse back to crosshair.x and crosshair.y but this (as well as the others) still allows the mouse to escape if the user clicks at the right moment. Any thoughts?
Main Class:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferStrategy;
import java.awt.image.MemoryImageSource;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class Game extends JFrame implements MouseMotionListener, MouseListener{
private int windowWidth = 640;
private int windowHeight = 480;
private Crosshair crosshair;
public static void main(String[] args) {
new Game();
}
public Game() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(windowWidth, windowHeight);
this.setResizable(false);
this.setLocation(0,0);
this.setVisible(true);
this.createBufferStrategy(2);
addMouseMotionListener(this);
addMouseListener(this);
initGame();
while(true) {
long start = System.currentTimeMillis();
gameLoop();
while(System.currentTimeMillis()-start < 5) {
//empty while loop
}
}
}
private void initGame() {
hideCursor();
crosshair = new Crosshair (windowWidth/2, windowHeight/2);
}
private void gameLoop() {
//game logic
drawFrame();
}
private void drawFrame() {
BufferStrategy bf = this.getBufferStrategy();
Graphics g = (Graphics)bf.getDrawGraphics();
try {
g = bf.getDrawGraphics();
Color darkBlue = new Color(0x010040);
g.setColor(darkBlue);
g.fillRect(0, 0, windowWidth, windowHeight);
drawCrossHair(g);
} finally {
g.dispose();
}
bf.show();
Toolkit.getDefaultToolkit().sync();
}
private void drawCrossHair(Graphics g){
Color yellow = new Color (0xEDFF62);
g.setColor(yellow);
g.drawOval(crosshair.x, crosshair.y, 40, 40);
g.fillArc(crosshair.x + 10, crosshair.y + 21 , 20, 20, -45, -90);
g.fillArc(crosshair.x - 1, crosshair.y + 10, 20, 20, -135, -90);
g.fillArc(crosshair.x + 10, crosshair.y - 1, 20, 20, -225, -90);
g.fillArc(crosshair.x + 21, crosshair.y + 10, 20, 20, -315, -90);
}
@Override
public void mouseDragged(MouseEvent e) {
//empty method
}
@Override
public void mouseMoved(MouseEvent e) {
crosshair.x = e.getX();
crosshair.y = e.getY();
}
private void hideCursor() {
int[] pixels = new int[16 * 16];
Image image = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(16, 16, pixels, 0, 16));
Cursor transparentCursor = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "invisiblecursor");
getContentPane().setCursor(transparentCursor);
}
public void mouseExited(MouseEvent e) {
System.out.println("Event: " + e);
try {
Robot robot = new Robot();
robot.mouseMove(0, 0);// When I use (getX(),getY()) instead of (0,0) the robot will not move the mouse at all even though getX() and getY() are the coordinates I want the mouse to be moved to. Also the mouse can still escape, even when crosshair.x and crosshair.y are used as the coordinates. It seems that robot is too slow.
}
catch (AWTException ex) {
ex.printStackTrace();
}
}
public void mouseEntered(MouseEvent e){
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
}
Another Class:
public class Crosshair{
public int x;
public int y;
public Crosshair(int x, int y) {
this.x = x;
this.y = y;
}
}