Java中用ArrayList存储鼠标点击坐标并绘制连线的实现求助
解决方案
要实现存储点击坐标并绘制连续连线的功能,只需对现有panel类做以下修改,结合你已有的XandY实体类即可完成需求:
修改后的panel类代码
import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; public class panel extends javax.swing.JPanel { // 声明并初始化存储坐标的ArrayList private ArrayList<XandY> points = new ArrayList<>(); public panel() { initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { setPreferredSize(new java.awt.Dimension(1000, 1000)); addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { formMouseClicked(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) ); } private void formMouseClicked(java.awt.event.MouseEvent evt) { // 创建XandY对象并添加到列表中 XandY newPoint = new XandY(evt.getX(), evt.getY()); points.add(newPoint); // 触发重绘,更新界面 repaint(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); setBackground(Color.GRAY); g.setColor(Color.RED); // 绘制所有点击的点 for (XandY point : points) { // 以坐标为中心绘制椭圆,调整偏移量让椭圆中心在点击位置 g.fillOval(point.getX() - 25, point.getY() - 25, 50, 50); } // 绘制连续点之间的连线(至少需要2个点) if (points.size() >= 2) { g.setColor(Color.BLUE); for (int i = 0; i < points.size() - 1; i++) { XandY current = points.get(i); XandY next = points.get(i + 1); g.drawLine(current.getX(), current.getY(), next.getX(), next.getY()); } } // 移除原有的repaint(),避免无限重绘循环 } }
关键修改说明
- 添加坐标存储容器:新增
private ArrayList<XandY> points = new ArrayList<>();,用来保存所有点击产生的坐标点,每次点击都会向列表中添加新的XandY对象。 - 修改鼠标点击事件逻辑:在
formMouseClicked方法中,不再只保存单个x、y值,而是创建XandY实例并加入列表,然后调用repaint()触发界面更新。 - 重写绘制逻辑:
- 遍历
points列表,绘制所有点击的椭圆点,调整椭圆的绘制位置(point.getX() - 25),让椭圆中心对齐点击坐标。 - 当列表中至少有2个点时,循环遍历相邻点,使用
drawLine方法绘制两点间的连线。
- 遍历
- 修复无限重绘问题:移除原
paintComponent方法中的repaint()调用,否则会导致界面无限重绘,消耗系统资源。
注意事项
- 你的
XandY类无需修改,保持现有代码即可正常工作。 - 若需要清空所有点,可添加一个按钮或右键菜单,调用
points.clear()后再执行repaint()。
内容的提问来源于stack exchange,提问作者Jonatan Liljenström
相关产品推荐
相关产品推荐

