java 捕获鼠标左右滚动,在Java窗口中捕获(捕获)鼠标光标

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;

}

}

解决方案

I guess you could use a Global Event Listener to listen for mouse entered events for the frame. Then on a mouse exited event I suppose you could use the Robot to reset the location of the mouse once it leaves the frame.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值