如何获得相对于 window 而不是屏幕的鼠标坐标?
How do I get my mouse coordinates relative to the window rather than the screen?
我正在尝试获取我的鼠标相对于 window 的坐标。
我知道我需要引用 JFrame 或其他东西,但我一生都无法弄清楚我的 class 是如何为我提供这个初学者代码的,我是从那里构建它的。
public class TheGame extends JFrame
{
public static final int WIDTH = 785;
public static final int HEIGHT = 670;
public static int width;
public static int height;
public static int borderX;
public static int borderY;
public TheGame()
{
super("PLATFORMGAME");
setSize(WIDTH,HEIGHT);
PlatformGame game = new PlatformGame();
((Component)game).setFocusable(true);
getContentPane().add(game);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main( String args[] )
{
TheGame run = new TheGame();
}
}
这是我的鼠标监听器class:
public class mouse extends JFrame {
static Point p;
BufferedImage sprite;
public mouse() {
Point p = MouseInfo.getPointerInfo().getLocation();
try {
sprite = ImageIO.read(new File("mouse_pointer.png")) ;
} catch (IOException e1) {
e1.printStackTrace();
}
}
public Point getlocation() {
return p = MouseInfo.getPointerInfo().getLocation();
}
public static double getNorP(double uno, double dos) {
if ((uno - dos) > 0) {return -1;}
else {return 1;}
}
public static double getX(Char c) {
return MouseInfo.getPointerInfo().getLocation().x ;
//return MouseInfo.getPointerInfo().getLocation().x - ReferenceJFrame.getLocationOnScreen().x;
}
public static double getY(Char c) {
return MouseInfo.getPointerInfo().getLocation().y -29;
//return MouseInfo.getPointerInfo().getLocation().y - ReferenceJFrame.getLocationOnScreen().y;
}
public static double getXD(Char c) {
return Math.abs(c.rX-(double)getX(c));
}
public static double getYD(Char c) {
return Math.abs(c.rY-(double)getY(c));
}
// public static float getAngle(Point target,int x,int y) {
// return (float) Math.toDegrees(Math.atan2(getX()-x, getY()-y));
}
public static double getXP(Char c) {
return (getXD(c))/(getXD(c)+getYD(c)) * getNorP(c.rX,getX(c));
}
public static double getYP(Char c) {
return (getYD(c))/(getXD(c)+getYD(c)) * getNorP(c.rY,getY(c));
}
public void draw(Graphics window, Char c) {
window.drawImage(sprite,(int) getX(c)-16,(int) getY(c)-8, 16, 16, null);
}
}
此 returns 鼠标相对于屏幕的坐标而不是 window。我了解很多 java 除了 JFrame 类型的内容。
您可以使用 JFrame
的方法 getLocation()
即 returns 一个 Point
对象。然后使用类似:
mouseX = MouseInfo.getPointerInfo().getLocation().x - frame.getLocation().x;
mouseY = MouseInfo.getPointerInfo().getLocation().y - frame.getLocation().y;
在您的情况下,getMouseLocation() 方法将如下所示:
public Point getMouseLocation(){
int x = MouseInfo.getPointerInfo().getLocation().x - run.getLocation().x;
int y = MouseInfo.getPointerInfo().getLocation().y - run.getLocation().y;
return new Point(x,y);
}
首先,不要使用 MouseInfo
,这并不是获取鼠标位置的最佳选择,相反,请先在 PlatformGame
中添加 MouseListener
,请参阅 How to Write a Mouse Listener 了解更多详情。
这将在调用鼠标侦听器时传递一个 MouseEvent
,它将在 MouseListener
注册到的组件的坐标 space 内,因此,不需要进行任何转换!
现在,如果出于某些奇怪的原因,您仍想从 PlatformGame
坐标 space 转换为框架坐标,您可以使用像...
这样简单的方法
evt = SwingUtilities.convertMouseEvent(evt.getComponent(), evt, SwingUtilities.windowForComponent(evt.getComponent()));
其中 evt
是 MouseEvent
我正在尝试获取我的鼠标相对于 window 的坐标。 我知道我需要引用 JFrame 或其他东西,但我一生都无法弄清楚我的 class 是如何为我提供这个初学者代码的,我是从那里构建它的。
public class TheGame extends JFrame
{
public static final int WIDTH = 785;
public static final int HEIGHT = 670;
public static int width;
public static int height;
public static int borderX;
public static int borderY;
public TheGame()
{
super("PLATFORMGAME");
setSize(WIDTH,HEIGHT);
PlatformGame game = new PlatformGame();
((Component)game).setFocusable(true);
getContentPane().add(game);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main( String args[] )
{
TheGame run = new TheGame();
}
}
这是我的鼠标监听器class:
public class mouse extends JFrame {
static Point p;
BufferedImage sprite;
public mouse() {
Point p = MouseInfo.getPointerInfo().getLocation();
try {
sprite = ImageIO.read(new File("mouse_pointer.png")) ;
} catch (IOException e1) {
e1.printStackTrace();
}
}
public Point getlocation() {
return p = MouseInfo.getPointerInfo().getLocation();
}
public static double getNorP(double uno, double dos) {
if ((uno - dos) > 0) {return -1;}
else {return 1;}
}
public static double getX(Char c) {
return MouseInfo.getPointerInfo().getLocation().x ;
//return MouseInfo.getPointerInfo().getLocation().x - ReferenceJFrame.getLocationOnScreen().x;
}
public static double getY(Char c) {
return MouseInfo.getPointerInfo().getLocation().y -29;
//return MouseInfo.getPointerInfo().getLocation().y - ReferenceJFrame.getLocationOnScreen().y;
}
public static double getXD(Char c) {
return Math.abs(c.rX-(double)getX(c));
}
public static double getYD(Char c) {
return Math.abs(c.rY-(double)getY(c));
}
// public static float getAngle(Point target,int x,int y) {
// return (float) Math.toDegrees(Math.atan2(getX()-x, getY()-y));
}
public static double getXP(Char c) {
return (getXD(c))/(getXD(c)+getYD(c)) * getNorP(c.rX,getX(c));
}
public static double getYP(Char c) {
return (getYD(c))/(getXD(c)+getYD(c)) * getNorP(c.rY,getY(c));
}
public void draw(Graphics window, Char c) {
window.drawImage(sprite,(int) getX(c)-16,(int) getY(c)-8, 16, 16, null);
}
}
此 returns 鼠标相对于屏幕的坐标而不是 window。我了解很多 java 除了 JFrame 类型的内容。
您可以使用 JFrame
的方法 getLocation()
即 returns 一个 Point
对象。然后使用类似:
mouseX = MouseInfo.getPointerInfo().getLocation().x - frame.getLocation().x;
mouseY = MouseInfo.getPointerInfo().getLocation().y - frame.getLocation().y;
在您的情况下,getMouseLocation() 方法将如下所示:
public Point getMouseLocation(){
int x = MouseInfo.getPointerInfo().getLocation().x - run.getLocation().x;
int y = MouseInfo.getPointerInfo().getLocation().y - run.getLocation().y;
return new Point(x,y);
}
首先,不要使用 MouseInfo
,这并不是获取鼠标位置的最佳选择,相反,请先在 PlatformGame
中添加 MouseListener
,请参阅 How to Write a Mouse Listener 了解更多详情。
这将在调用鼠标侦听器时传递一个 MouseEvent
,它将在 MouseListener
注册到的组件的坐标 space 内,因此,不需要进行任何转换!
现在,如果出于某些奇怪的原因,您仍想从 PlatformGame
坐标 space 转换为框架坐标,您可以使用像...
evt = SwingUtilities.convertMouseEvent(evt.getComponent(), evt, SwingUtilities.windowForComponent(evt.getComponent()));
其中 evt
是 MouseEvent