在透明 window 中获取鼠标位置
Getting mouse position in a transparent window
所以我有一个透明的 window 可以绘制一些线条和 HUD 元素。我想知道当我按下热键设置(例如 ctrl-s 或其他东西)并保存鼠标 x 和 y 时,是否有办法在 window 内获取鼠标的位置,这样我就可以使用更新后的变量重新绘制框架。
我的框架代码是这样的:
JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.add(new AimDriver());
frame.setBackground(new Color(0,0,0,0));
frame.setSize(resolutionX, resolutionY);
frame.setAlwaysOnTop(true);
frame.setVisible(true);
其中aimDriver拥有所有的绘画方法。感谢您的帮助!
向您的框架对象添加一个 Key Listener。您可以使用 this post 作为参考。转到上面 post 中的 keyPressed 事件并用代码替换 println 方法以检索鼠标指针位置并更新您的位置变量。您应该能够使用此代码获取 JFrame 中的相对鼠标坐标。
int xCoord = MouseInfo.getPointerInfo().getLocation().x - frame.getLocationOnScreen().x;
int yCoord = MouseInfo.getPointerInfo().getLocation().y - frame.getLocationOnScreen().y;
KeyBinding
比 KeyListener
有几个优点。也许最重要的优点是 KeyBinding
不会遇到 KeyListener
可能会遇到的焦点问题(有关详细说明,请参阅 this question。)
下面的方法遵循 KeyBinding
Java Tutorial。首先,创建一个 AbstractAction
来捕获鼠标在 window:
中的位置
AbstractAction action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Point mLoc = MouseInfo.getPointerInfo().getLocation();
Rectangle bounds = frame.getBounds();
// Test to make sure the mouse is inside the window
if(bounds.contains(mLoc)){
Point winLoc = bounds.getLocation();
mouseLoc = new Point(mLoc.x - winLoc.x, mLoc.y - winLoc.y);
}
}
};
注意:测试window是否包含鼠标位置很重要;如果不这样做,鼠标位置很容易包含无意义的坐标(例如 (-20,199930),那到底是什么意思?)。
既然您已经有了所需的操作,请创建适当的 KeyBinding
。
// We add binding to the RootPane
JRootPane rootPane = frame.getRootPane();
//Specify the KeyStroke and give the action a name
KeyStroke KEY = KeyStroke.getKeyStroke("control S");
String actionName = "captureMouseLoc";
//map the keystroke to the actionName
rootPane.getInputMap().put(KEY, actionName);
//map the actionName to the action itself
rootPane.getActionMap().put(actionName, action);
所以我有一个透明的 window 可以绘制一些线条和 HUD 元素。我想知道当我按下热键设置(例如 ctrl-s 或其他东西)并保存鼠标 x 和 y 时,是否有办法在 window 内获取鼠标的位置,这样我就可以使用更新后的变量重新绘制框架。
我的框架代码是这样的:
JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.add(new AimDriver());
frame.setBackground(new Color(0,0,0,0));
frame.setSize(resolutionX, resolutionY);
frame.setAlwaysOnTop(true);
frame.setVisible(true);
其中aimDriver拥有所有的绘画方法。感谢您的帮助!
向您的框架对象添加一个 Key Listener。您可以使用 this post 作为参考。转到上面 post 中的 keyPressed 事件并用代码替换 println 方法以检索鼠标指针位置并更新您的位置变量。您应该能够使用此代码获取 JFrame 中的相对鼠标坐标。
int xCoord = MouseInfo.getPointerInfo().getLocation().x - frame.getLocationOnScreen().x;
int yCoord = MouseInfo.getPointerInfo().getLocation().y - frame.getLocationOnScreen().y;
KeyBinding
比 KeyListener
有几个优点。也许最重要的优点是 KeyBinding
不会遇到 KeyListener
可能会遇到的焦点问题(有关详细说明,请参阅 this question。)
下面的方法遵循 KeyBinding
Java Tutorial。首先,创建一个 AbstractAction
来捕获鼠标在 window:
AbstractAction action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Point mLoc = MouseInfo.getPointerInfo().getLocation();
Rectangle bounds = frame.getBounds();
// Test to make sure the mouse is inside the window
if(bounds.contains(mLoc)){
Point winLoc = bounds.getLocation();
mouseLoc = new Point(mLoc.x - winLoc.x, mLoc.y - winLoc.y);
}
}
};
注意:测试window是否包含鼠标位置很重要;如果不这样做,鼠标位置很容易包含无意义的坐标(例如 (-20,199930),那到底是什么意思?)。
既然您已经有了所需的操作,请创建适当的 KeyBinding
。
// We add binding to the RootPane
JRootPane rootPane = frame.getRootPane();
//Specify the KeyStroke and give the action a name
KeyStroke KEY = KeyStroke.getKeyStroke("control S");
String actionName = "captureMouseLoc";
//map the keystroke to the actionName
rootPane.getInputMap().put(KEY, actionName);
//map the actionName to the action itself
rootPane.getActionMap().put(actionName, action);