【问题标题】:How to draw a circle around current position?如何在当前位置周围画一个圆圈?
【发布时间】:2020-06-26 11:46:03
【问题描述】:

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

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

    公共类 Main 扩展 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);
        }
    

    }

【问题讨论】:

  • 1) 需要我传递一个 Graphics 对象 - 这不是自定义绘画的方式。您将在 JPanel 上进行自定义绘画。 Graphics 对象被传递给面板供您使用。请参阅Custom Painting Approaches 并决定哪种方法最适合您。
  • 2) * 圆心将是单击按钮的位置。* - 然后您可以执行类似 a) 创建一个布尔实例变量来指示“添加节点”按钮是否被按下。 b) 将 MouseListener 添加到 JPanel。在 mousePressed 事件中,您将检查变量是否为 true 并添加节点,然后将变量重置为 false。

标签: java swing user-interface event-handling awt


【解决方案1】:

试试这个。当您查看有关绘画的教程或查阅 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();
        }
    }
}

【讨论】:

  • 非常感谢!后续问题:为什么没有 main 方法运行?
  • 它有一个main方法。在 Main() 构造函数的正上方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多