如何围绕当前位置画一个圆圈?
How to draw a circle around current position?
我正在尝试构建一个允许您绘制图形的程序。我目前正在尝试添加一个函数来向图中添加一个节点。我的想法是,用户可以单击一个按钮,然后单击 window 上的某处来添加一个节点。我现在面临以下两个问题:
- drawCenteredCircle 方法需要我传递一个 Graphics 对象,但是是哪个?因为它是一个抽象class我不能简单地声明一个新实例,所以我可以传递什么?
目前圆心的位置将是点击按钮的位置。我该如何解决这个问题?我希望 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();
}
}
}
我正在尝试构建一个允许您绘制图形的程序。我目前正在尝试添加一个函数来向图中添加一个节点。我的想法是,用户可以单击一个按钮,然后单击 window 上的某处来添加一个节点。我现在面临以下两个问题:
- drawCenteredCircle 方法需要我传递一个 Graphics 对象,但是是哪个?因为它是一个抽象class我不能简单地声明一个新实例,所以我可以传递什么?
目前圆心的位置将是点击按钮的位置。我该如何解决这个问题?我希望 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();
}
}
}