【问题标题】:Mouse doesn't maintain it's position when frame is moved across the screen当框架在屏幕上移动时,鼠标不会保持其位置
【发布时间】:2013-03-25 21:23:51
【问题描述】:

这里是代码。

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

    }



}

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

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

【问题讨论】:

    标签: java awt mouseevent repaint paintcomponent


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是的,谢谢,这行得通。虽然它给我带来了一个空指针。有什么办法可以设置一个临时点,以便在加载程序时它不会抛出空指针?私有 int x = (int) myPoint.getX();
    • 在您的paintComponent 方法中,只需检查myPoint 是否为null,如果是,请不要费心绘制任何内容。您可以初始化为您想要的任何内容...例如myPoint = new Point(0, 0)
    【解决方案2】:

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

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

    • 告诉我们更多关于您正在尝试做什么以及您的程序如何不工作的信息。
    • 创建并发布 sscce,这是一个可编译和可运行的小型程序,可向我们展示您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多