每次鼠标移动时获取鼠标坐标

时间:2014-02-16 12:44:37

标签: java swing mouselistener

所以我有这个代码,但是我不知道如何在每次鼠标移动时将鼠标坐标设置为标签......

timer.schedule(new TimerTask() {

    @Override
    public void run() {
        int mouseX = MouseInfo.getPointerInfo().getLocation().x;
        int mouseY = MouseInfo.getPointerInfo().getLocation().y;
        lblInfo.setText("Nada "+mouseX+mouseY);
    }

}, 1);

我甚至不确定代码是否正确,但我想要它做的是每次鼠标移动时在标签lblInfo中获取鼠标坐标。

此代码只在程序启动时显示一次...

2 个答案:

答案 0 :(得分:3)

您需要implements MouseMotionListener,然后在mouseMoved方法中添加逻辑,如:

public class MyClass implements MouseMotionListener {

    public void mouseMoved(MouseEvent e) {
       System.out.println("X : " + e.getX());
       System.out.println("Y : " + e.getY());
    }

    public void mouseDragged(MouseEvent e) {
       //do something
    }

}

详细了解MouseMotionListener

答案 1 :(得分:0)

看看这个例子。您首先需要实施mousePresseded 然后 mouseDragged。第一个得到初始印刷的点,然后mouseDragged将使用这些坐标。

addMouseListener(new MouseAdapter() {
     public void mousePressed(MouseEvent me) {
         // Get x,y and store them
         pX = me.getX();
         pY = me.getY();
     }
});
addMouseMotionListener(new MouseAdapter() {
     public void mouseDragged(MouseEvent me) {
         frame.setLocation(frame.getLocation().x + me.getX() - pX, 
              frame.getLocation().y + me.getY() - pY);
     }
});

完整的运行示例。它使用一个undecorate框架并创建一个JPanel作为标题,您可以拖动它来移动框架。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class UndecoratedExample {
    static JFrame frame = new JFrame();
    static class MainPanel extends JPanel {
        public MainPanel() {
            setBackground(Color.gray);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    }

    static class BorderPanel extends JPanel {

        JLabel stackLabel;
        int pX, pY;

        public BorderPanel() {
            ImageIcon icon = new ImageIcon(getClass().getResource(
                    "/resources/stackoverflow1.png"));
            stackLabel = new JLabel();
            stackLabel.setIcon(icon);

            setBackground(Color.black);
            setLayout(new FlowLayout(FlowLayout.RIGHT));

            add(stackLabel);

            stackLabel.addMouseListener(new MouseAdapter() {
                public void mouseReleased(MouseEvent e) {
                    System.exit(0);
                }
            });
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent me) {
                    // Get x,y and store them
                    pX = me.getX();
                    pY = me.getY();
                }
            });
            addMouseMotionListener(new MouseAdapter() {
                public void mouseDragged(MouseEvent me) {
                    frame.setLocation(frame.getLocation().x + me.getX() - pX, 
                            frame.getLocation().y + me.getY() - pY);
                }
            });
        }
    }

    static class OutsidePanel extends JPanel {

        public OutsidePanel() {
            setLayout(new BorderLayout());
            add(new MainPanel(), BorderLayout.CENTER);
            add(new BorderPanel(), BorderLayout.PAGE_START);
            setBorder(new LineBorder(Color.BLACK, 5));
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {

                frame.setUndecorated(true);
                frame.add(new OutsidePanel());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}