1

这是代码。

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();

    }



}

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

有人可以告诉我哪里出了问题或如何解决这个问题吗?

4

2 回答 2

3

绘制是从组件的上下文中完成的。任何给定组件的Graphics上下文都会被转换,以便左上角为 0x0。

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

虽然有一种方法可以修复它,但更好的解决方案是简单地使用 aMouseMotionListener代替。发送到这个MouseEvent方法的已经被翻译到了组件坐标空间...

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

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

于 2013-04-04T00:17:27.177 回答
1

我认为您最好在 MouseAdapter 中更改您的类的状态,调用repaint()然后让您的paintComponent(...)方法使用此状态来帮助它绘制。这对我来说似乎比在paintComponent(...).

除此之外,如果您需要更具体的帮助,请考虑

  • 告诉我们更多关于您正在尝试做什么以及您的程序如何不工作的信息。
  • 创建并发布一个sscce,一个小型可编译和可运行的程序,为我们演示您的问题。
于 2013-04-04T00:16:38.263 回答