如何围绕当前位置画一个圆圈?

How to draw a circle around current position?

我正在尝试构建一个允许您绘制图形的程序。我目前正在尝试添加一个函数来向图中添加一个节点。我的想法是,用户可以单击一个按钮,然后单击 window 上的某处来添加一个节点。我现在面临以下两个问题:

  1. drawCenteredCircle 方法需要我传递一个 Graphics 对象,但是是哪个?因为它是一个抽象class我不能简单地声明一个新实例,所以我可以传递什么?
  2. 目前圆心的位置将是点击按钮的位置。我该如何解决这个问题?我希望 AFTER 按钮被单击,NEXT 单击将添加一个节点。基本上我需要一个等待另一个用户输入然后添加这个节点的函数。

    public class 主要扩展 JFrame {

    int width = 500;
    int height = 500;
    JLabel label;
    JPanel panel;
    JButton addNodeButton;
    
    public Main() {
        setSize(width, height);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        panel = new JPanel();
        label = new JLabel();
        addNodeButton = new JButton("Add Node");
        addNodeButton.addActionListener((new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Point p = MouseInfo.getPointerInfo().getLocation();
                drawCenteredCircle(g, p.x, p.y, 3);
            }
    
        }));
        panel.add(addNodeButton);
        this.add(panel);
        setVisible(true);
    
    }
    
    public static void main(String a[]) {
        new Main();
    }
    
    public void drawCenteredCircle(Graphics2D g, int x, int y, int r) {
          x = x-(r/2);
          y = y-(r/2);
          g.fillOval(x,y,r,r);
        }
    

    }

试试这个。当您查看绘画教程或查阅Java API时,将会有解释。我使用 mouseListener 而不是按钮。它会在您单击按钮的位置周围绘制一个圆圈。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
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 java.util.List;

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

public class Main extends JPanel {
    int width = 500;
    int height = 500;
    JFrame frame = new JFrame();
    int x;
    int y; 
    int diameter = 60;
    List<Point> points = new ArrayList<>();
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Main());
    }

    public Main() {
        setPreferredSize(new Dimension(width, height));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBackground(Color.white);
        addMouseListener(new MyMouseListener());
        frame.add(this);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
              g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.blue);
        g2d.setStroke(new BasicStroke(3));
        for(Point p : points) {
            g2d.drawOval(p.x,p.y, diameter,diameter);
        }

    }

    private class MyMouseListener extends MouseAdapter {
        public void mouseClicked(MouseEvent me) {
            x = me.getX()-diameter/2;
            y = me.getY()-diameter/2;
            points.add(new Point(x,y));
            repaint();
        }
    }
}