java - 鼠标单击后在 JPanel 上绘制圆圈

标签 java swing

我只想在点击鼠标后画圆圈。由于 paintComponent 方法调用了它自己,所以先画圆,没有点击。

public class DrawPanel extends JPanel implements MouseListener {
private static final long serialVersionUID = 1L;
int x, y;

public DrawPanel() {
    setBackground(Color.WHITE);
    addMouseListener(this);
}

public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.red);
    g2.fillOval(x, y, 20, 20);
}

@Override
public void mouseClicked(MouseEvent e) {
    x = e.getX();
    y = e.getY();
    repaint();
}

}

最佳答案

您的代码存在一些问题:

  1. 永远不要调用 super.paintComponent();
  2. 你只有一个xy
  3. 请注意,当您调整框架大小时,一些圆圈会消失,整体表现会很奇怪。
  4. 我会将用户单击的所有 Point 存储在 ArrayList 中,然后在 paintComponent 方法中循环遍历该列表。这样您就可以调用 super.paintComponent(); 而圆圈不会消失。

已更改,工作代码:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private ArrayList<Point> points;

    public DrawPanel() {
        points = new ArrayList<Point>();
        setBackground(Color.WHITE);
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                points.add(new Point(e.getX(), e.getY()));
                repaint();
            }
        });
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(Color.red);
        for (Point point : points) {
            g2.fillOval(point.x, point.y, 20, 20);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new DrawPanel());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400, 400);
                frame.setVisible(true);
            }
        });
    }

}

关于java - 鼠标单击后在 JPanel 上绘制圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35299786/

相关文章:

java - 如何从jspx输出 "&"?

java - 我如何可视化查找列表最大数量的递归实现?

java - 制作两个选项窗口的最佳方法是什么?

java - Jtable,为每个ROW使用不同的对齐方式

java - 创建具有自定义外观的 JButton

java - 用于将测试分离为单元和集成测试失败的 Maven Surefire 配置

java - 操作 JComboBox

java - 禁用/覆盖 JTree 鼠标按下/单击处理的正确方法

java - 某些计算方法中的"int cannot be dereferenced"

java - 获取 Java 套接字连接