有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这是代码

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

    }



}

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

有人能告诉我哪里出了问题,或者如何解决这个问题吗


共 (2) 个答案

  1. # 1 楼答案

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

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

    虽然有办法解决这个问题,但更好的解决方案是简单地使用MouseMotionListener。发送到此方法的MouseEvent已被转换为组件坐标空间

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

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

  2. # 2 楼答案

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

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

    • 告诉我们你到底想做什么,以及你的程序是如何工作的
    • 创建并发布一个sscce,这是一个小型的可编译和可运行程序,可以向我们展示您的问题