Java-相对于JFrame的光标位置

Java-相对于JFrame的光标位置,java,swing,jframe,mouse,Java,Swing,Jframe,Mouse,尝试使用以下命令使对象跟随光标: int mx =(int) MouseInfo.getPointerInfo().getLocation().getX()-50; Player.setX(mx); 用我的滴答法。然而,这将返回屏幕上的光标位置,如何使其相对于JFrame本身?是否有办法读取画布中左上角点的位置,以便添加偏移量?创建鼠标侦听器,并从中获取坐标: public class SimpleFrame extends JFrame { public static void main(S

尝试使用以下命令使对象跟随光标:

int mx =(int) MouseInfo.getPointerInfo().getLocation().getX()-50;
Player.setX(mx);

用我的滴答法。然而,这将返回屏幕上的光标位置,如何使其相对于JFrame本身?是否有办法读取画布中左上角点的位置,以便添加偏移量?

创建鼠标侦听器,并从中获取坐标:

public class SimpleFrame extends JFrame {
public static void main(String[] args) {
    SimpleFrame frame = new SimpleFrame();
    frame.setSize(new Dimension(200, 300));
    frame.setLocation(new Point(500, 600));
    frame.setVisible(true);
    frame.addMouseListener(new MouseListener() {
        @Override
        public void mouseReleased(MouseEvent e) {
            System.out.println(e.getX() + " / " + e.getY());
        }
        @Override
        public void mousePressed(MouseEvent e) {
        }
        @Override
        public void mouseExited(MouseEvent e) {
        }
        @Override
        public void mouseEntered(MouseEvent e) {
        }
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
}
}
当您测试这一点时,您可能会意识到您希望获得相对于其他对象的坐标,例如应用程序的主面板。然后为该组件创建鼠标侦听器:

SimpleFrame frame = new SimpleFrame();
JPanel mainPanel = new JPanel();
frame.add(mainPanel, ...);
mainPanel.addMouseListener(...
这样做比从JFrame的mouseListener获得的坐标中减去常量要好得多,因为这些“常量”会因操作系统等而异

如果您希望在用户移动鼠标时(不仅仅是在他/她单击鼠标时)显示事件,请使用以下命令:

    frame.addMouseMotionListener(new MouseMotionListener() {
        @Override
        public void mouseMoved(MouseEvent e) {
            System.out.println(e.getX() + " / " + e.getY());
        }
        @Override
        public void mouseDragged(MouseEvent e) {
    });

创建鼠标侦听器,并从中获取坐标:

public class SimpleFrame extends JFrame {
public static void main(String[] args) {
    SimpleFrame frame = new SimpleFrame();
    frame.setSize(new Dimension(200, 300));
    frame.setLocation(new Point(500, 600));
    frame.setVisible(true);
    frame.addMouseListener(new MouseListener() {
        @Override
        public void mouseReleased(MouseEvent e) {
            System.out.println(e.getX() + " / " + e.getY());
        }
        @Override
        public void mousePressed(MouseEvent e) {
        }
        @Override
        public void mouseExited(MouseEvent e) {
        }
        @Override
        public void mouseEntered(MouseEvent e) {
        }
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
}
}
当您测试这一点时,您可能会意识到您希望获得相对于其他对象的坐标,例如应用程序的主面板。然后为该组件创建鼠标侦听器:

SimpleFrame frame = new SimpleFrame();
JPanel mainPanel = new JPanel();
frame.add(mainPanel, ...);
mainPanel.addMouseListener(...
这样做比从JFrame的mouseListener获得的坐标中减去常量要好得多,因为这些“常量”会因操作系统等而异

如果您希望在用户移动鼠标时(不仅仅是在他/她单击鼠标时)显示事件,请使用以下命令:

    frame.addMouseMotionListener(new MouseMotionListener() {
        @Override
        public void mouseMoved(MouseEvent e) {
            System.out.println(e.getX() + " / " + e.getY());
        }
        @Override
        public void mouseDragged(MouseEvent e) {
    });

不确定如何访问此方法?单击或移动鼠标时,Swing将为您调用这些方法。这就是事件模型的工作原理(尽管一开始可能感觉有点倒退:)。然后,您的工作就是对事件进行操作,通常是通过调用方法来执行用户单击/移动鼠标时应执行的操作。不确定如何访问此方法?单击或移动鼠标时,Swing将为您调用这些方法。这就是事件模型的工作原理(尽管一开始可能感觉有点倒退:)。然后,您的工作就是对事件进行操作,通常是调用在用户单击/移动鼠标时执行任何操作的方法。