Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaswing中的鼠标指针问题_Java_Swing_Pointers_Arraylist_Mouselistener - Fatal编程技术网

javaswing中的鼠标指针问题

javaswing中的鼠标指针问题,java,swing,pointers,arraylist,mouselistener,Java,Swing,Pointers,Arraylist,Mouselistener,我创建了以下简单的Java Swing程序,每当用户单击鼠标时,它会在窗口中输出一个3*3的正方形。即使用户多次单击,正方形仍保留在窗口中。该程序编译和运行得很好,但是,当在窗口中单击时,正方形被画在鼠标指针所在位置的下方。我已经绞尽脑汁想了一段时间了——我可以在这里做些什么改变,使正方形在每次点击时都与指针完全一致?非常感谢您的帮助 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.Mouse

我创建了以下简单的Java Swing程序,每当用户单击鼠标时,它会在窗口中输出一个3*3的正方形。即使用户多次单击,正方形仍保留在窗口中。该程序编译和运行得很好,但是,当在窗口中单击时,正方形被画在鼠标指针所在位置的下方。我已经绞尽脑汁想了一段时间了——我可以在这里做些什么改变,使正方形在每次点击时都与指针完全一致?非常感谢您的帮助

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JComponent;
import javax.swing.JFrame;


public class ClickCloud extends JComponent {

    final ArrayList<Point2D> points = new ArrayList<Point2D>();

    public void addPoint(Point2D a) {
        points.add(a);
    }

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        for (int i = 0; i < points.size(); i++) {
            Point2D aPoint = points.get(i);
            g2.draw(new Rectangle2D.Double(aPoint.getX(), aPoint.getY(), 3, 3));
        }
    }

    public static void main(String[] args) {
        final ClickCloud cloud = new ClickCloud();
        JFrame aFrame = new JFrame();

        class ClickListen implements MouseListener {

            @Override
            public void mouseClicked(MouseEvent arg0) {
            }

            @Override
            public void mouseEntered(MouseEvent arg0) {
            }

            @Override
            public void mouseExited(MouseEvent arg0) {
            }

            public void mousePressed(MouseEvent arg0) {

                cloud.addPoint(arg0.getPoint());
                cloud.repaint();

            }

            @Override
            public void mouseReleased(MouseEvent arg0) {

            }
        }

        aFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        aFrame.setSize(500, 500);
        aFrame.add(cloud);
        aFrame.addMouseListener(new ClickListen());
        aFrame.setVisible(true);
    }
}
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.geom.Point2D;
导入java.awt.geom.Rectangle2D;
导入java.util.ArrayList;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
公共类ClickCloud扩展JComponent{
最终ArrayList点=新ArrayList();
公共无效添加点(点2D a){
增加(a)点;
}
公共组件(图形g){
图形2d g2=(图形2d)g;
对于(int i=0;i
您正在将MouseListener添加到JFrame中,但会在JComponent中显示结果以及相对于JComponent的结果。因此,单击点的位置将相对于JFrame的坐标,但随后将相对于JComponent的坐标显示,这将使内容向下移动标题栏的距离。相反,只需将MouseListener添加到负责显示结果的同一组件中,以便显示和单击坐标匹配:

  aFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  aFrame.setSize(500, 500);
  aFrame.add(cloud);
  //!! aFrame.addMouseListener(new ClickListen());  // !! Removed
  cloud.addMouseListener(new ClickListen());  // !! added
  aFrame.setVisible(true);

顺便说一句:感谢您创建并发布了一个体面的网站,因为这样可以更轻松地分析和解决您的问题。

不要感谢我,我是问这个问题的人!哈哈,你帮了大忙,非常感谢!一个快速而优秀的解决方案。