0

我想在移动鼠标时使用 drawString() 方法显示鼠标坐标。这是我当前的代码。这适用于 mouseClicked(MouseEvent e) 方法,但不适用于 mouseMoved(MouseEvent e) 方法。有人可以帮我吗?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JFrame {

    public Test() {
        PaintLocaion paintlocation = new PaintLocaion();
        paintlocation.setSize(400,300);
        add(paintlocation, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
    }

    public static void main(String[] args) {
        new Test().setVisible(true);
    }

    private class PaintLocaion extends JPanel {
        int x, y;

        public PaintLocaion() {          
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseMoved(MouseEvent e) {
                    x = e.getX();
                    y = e.getY();
                    repaint();
                }
            });
        }      

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
            g.setColor(Color.white);
            g.drawString(x + ", " + y, 10, 10);
        }
    }     
}
4

2 回答 2

4

而不是注册一个MouseListener你需要注册一个MouseMotionListener...

public PaintLocaion() {          
    addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseMoved(MouseEvent e) {
            x = e.getX();
            y = e.getY();
            repaint();
        }
    });
}      

有关详细信息,请参阅如何编写鼠标运动侦听器

根据 mKorbel 的评论更新

覆盖存在问题paint,虽然这似乎是合乎逻辑的事情,paint但当重绘发生时,由该方法开始更新的区域可能不会更新,您最终可能会遇到一些奇怪的绘制问题。

建议paintComponent改用。

如果您尝试在顶部组件上绘画,您可以考虑使用玻璃窗格或JXLayer/JLayer代替

查看在 AWT 和 Swing 中的绘画,了解有关绘画过程的更多详细信息。 如何使用根窗格获取有关玻璃窗格的详细信息以及如何使用 JLayer 类装饰组件

于 2013-08-19T07:50:35.037 回答
2

您可以尝试使用MouseMotionListener http://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html

于 2013-08-19T07:51:08.260 回答