【问题标题】:Java - Cursor position relative to JFrameJava - 相对于 JFrame 的光标位置
【发布时间】:2020-04-19 12:24:31
【问题描述】:

试图让一个对象跟随光标使用:

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

在我的勾选方法中。但是,这会返回屏幕上的光标位置,我怎样才能使它相对于 JFrame 本身?有没有办法读取画布左上角的位置,以便我可以添加偏移量?

【问题讨论】:

    标签: java swing jframe mouse


    【解决方案1】:

    创建一个鼠标监听器,并从那里获取坐标:

    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 会在鼠标被点击或移动时为你调用这些方法。这就是事件模型的工作原理(尽管一开始可能会感觉有点倒退:))。然后,您的工作就是对事件采取行动,通常是通过调用方法来执行用户单击/移动鼠标时应该执行的操作。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2017-08-21
    • 2012-05-04
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多