1

我对以下代码有疑问。我的意图是使用 getPoint 将鼠标单击的坐标存储到数组列表中,然后在用户单击的每个位置绘制一个矩形。我已经搜索了如何从 getPoint 对象中单独提取 x 和 y 坐标的高低搜索,但无济于事。我是java新手,在编译时给我带来麻烦的行是:

g2.drawRect(coordinateList(j).getHeight(),coordinateList(j.getWidth(),3,3);

我知道我可能还差得很远,但是如何从数组列表中分别提取一个点的 x 和 y 坐标,将数组的一项逐一提取,以便在新的单击点处重新绘制一个矩形以及所有以前的点击也是?

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.event.MouseListener;
import java.awt.Point;
import java.util.*;

public class ClickCloud extends JPanel
{
    private int pointxy;
    //private Rectangle2D.Double r1;
    private boolean mouseClick;
    private int count;
    //private Point[] points;
    private Point coordinates = new Point(0, 0);
    private ArrayList<Point> coordinateList = new ArrayList<Point>();

    public ClickCloud() {
        this.setPreferredSize(new Dimension(500,500));
        this.addMouseListener(new MyMouseListener());
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g; 
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
          RenderingHints.VALUE_ANTIALIAS_ON);

        for (int j = 0; j < count; j++) {
            g2.setStroke(new BasicStroke(1.0f));
            g2.setPaint(Color.BLUE);
            g2.drawRect(coordinateList(j).getHeight(),coordinateList(j.getWidth(),3,3);
        }
    }

    private class MyMouseListener implements MouseListener {
        public void mouseClicked(MouseEvent me) { 
            count++;
            coordinates.setLocation(me.getPoint());
            coordinateList.add(coordinates.getLocation());
            repaint();
        }
        public void mousePressed(MouseEvent me) { }
        public void mouseReleased(MouseEvent me) { }
        public void mouseEntered(MouseEvent me) { }
        public void mouseExited(MouseEvent me) { }
    }

     public static void main(String[] args) {
        JFrame f = new JFrame("ClickCloud demo");
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setLayout(new FlowLayout());
        f.add(new ClickCloud());
        f.pack();
        f.setVisible(true);        
    }
}

谢谢,

4

2 回答 2

3

忘记所有的getLocationsetLocation。这是多余的。只需存储me.getPoint()在您的coordinateList.

然后你可以分别得到xy坐标。point.getX()point.getY()

paintComponent中,有一种更简单的方法可以遍历点列表:

for (Point coordinate : coordinateList) { //"for each coordinate in coordinateList"
   //do something with coordinate.getX() and coordinate.getY()
}
于 2013-03-03T19:15:53.140 回答
0

您没有从 ArrayList 中正确获得积分。

g2.drawRect(coordinateList(j).getHeight(),coordinateList(j.getWidth(),3,3);

j使用 ArrayList 获取索引处的项目,您只需使用以下方法get()

Point point = coordinateList.get(j);

那么问题是point只表示点......它们只有X和Y坐标,而不是宽度和高度。如果我试图猜测你想要做什么并假设你想在用户点击的地方绘制 3x3 矩形,你会这样调用drawRect()

g2.drawRect(point.getX(), point.getY(), 3, 3);

还:

  • 您无需处理count变量即可知道 ArrayList 中的点数。只需使用坐标列表的 size() 方法,甚至更好,使用增强的 for 循环
  • 您可以使用 MouseAdapter 而不是 MouseListener 来仅覆盖您需要的事件。
  • 您不需要coordinates成员和 get/setLocation 的东西。写吧coordinateList.add(me.getPoint());
于 2013-03-03T19:16:49.277 回答