java - 当框架在屏幕上移动时,鼠标不会保持其位置

标签 java awt mouseevent repaint paintcomponent

这是代码。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;


public class Paint extends JPanel implements MouseMotionListener, MouseListener {

    public Paint() {        
        setBackground(Color.RED);
        addMouseMotionListener(this);
        addMouseListener(this);
    }

    private boolean clicked = false;

    public void paintComponent (Graphics g) {
        super.paintComponent(g);
        PointerInfo a = MouseInfo.getPointerInfo();
        Point b = a.getLocation();
        int x = (int) b.getX() - 3;
        int y = (int) b.getY() - 23;

        if (clicked) {
            g.drawLine(x, y-5000, x,y+5000);
            g.drawLine(x+5000,y,x-5000,y);
            g.setColor(Color.white);
        }

        g.drawLine(x, y-5000, x,y+5000);
        g.drawLine(x+5000,y,x-5000,y);
        g.setColor(Color.black);




        // . . .
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        repaint();

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        repaint();
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        clicked = true;
        repaint();

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        clicked = false;
        repaint();

    }




}

public class Frame extends JFrame {

    public Frame() {
        this.setSize(500,500);
        this.setTitle("Test painting");
        this.setResizable(false);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        Paint panel = new Paint();

        this.add(panel);

        this.setVisible(true);
    }

    public static void main (String[] args) {
        new Frame();

    }



}

当我运行程序时,当应用程序处于默认位置时它看起来工作正常,但是一旦我将小程序移动到屏幕上我喜欢的位置,线条就不会保持当前鼠标在屏幕上的位置.

谁能告诉我哪里出了问题或如何解决这个问题?

最佳答案

绘画是从组件的上下文中完成的。任何给定组件的 Graphics 上下文都被翻译成左上角为 0x0。

MouseInfo.getPointerInfo().getLocation() 返回鼠标在屏幕上的位置,而不是相对于组件的位置。

虽然有办法修复它,但更好的解决方案是简单地使用 MouseMotionListener 代替。发送到此方法的 MouseEvent 已经被转换到组件坐标空间...

public void mouseMoved(MouseEvent me) {
    myPoint = me.getPoint();
}

然后在你的 paintComponent 方法中,简单地引用 myPoint 而不是尝试使用 MouseInfo

关于java - 当框架在屏幕上移动时,鼠标不会保持其位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800436/

相关文章:

Java - Swing 中的 mouseMoved() 事件处理

java - 使用 JTable 的 ClassCastException?

Java 2D,在 X 和 Y 轴上具有相同数量的翻译会导致不同的结果

java - MinMax-生成游戏树

下载大数据时 HttpServer 上的 java.lang.OutOfMemoryError

java - 为什么事件没有发布到 AWT EventQueue?

java - getCursor() 在我的 actionListener 中不起作用

jquery - 如何在鼠标移动时隐藏div并在停止时显示div?

java - Java使用内部类的方法引用

java - Ajax 登录请求在 jquery 中使用 $.post() 方法不起作用