这是代码。

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

09-25 22:24
查看更多