在透明 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;

KeyBindingKeyListener 有几个优点。也许最重要的优点是 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);