You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()触发界面更新。
  • 重写绘制逻辑:
    1. 遍历points列表,绘制所有点击的椭圆点,调整椭圆的绘制位置(point.getX() - 25),让椭圆中心对齐点击坐标。
    2. 当列表中至少有2个点时,循环遍历相邻点,使用drawLine方法绘制两点间的连线。
  • 修复无限重绘问题:移除原paintComponent方法中的repaint()调用,否则会导致界面无限重绘,消耗系统资源。

注意事项

  • 你的XandY类无需修改,保持现有代码即可正常工作。
  • 若需要清空所有点,可添加一个按钮或右键菜单,调用points.clear()后再执行repaint()。

内容的提问来源于stack exchange,提问作者Jonatan Liljenström

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:36:29