单击按钮向JPanel添加形状

我有一个带有按钮的Class Circle和一个带有jPanel的Class我想要做的是当点击该按钮时,将在面板上绘制一个圆圈,每次我点击该按钮并更改x和y“有些未实现在这里“我一遍又一遍地在JPanel上圈了一圈。 怎么做,或者有没有办法做我描述的,无论我的代码,但我希望类圈扩展形状。

public class Window{ private JFrame frame; private JPanel panel = new JPanel(); Circle c = new Circle(frame, panel); // some other buttons . . // some code to set the panel grid bag constaraints and background then frame.getContentPane().add(panel, gbc_panel); } 

然后圆圈类

 public class Circle extends Shape implements ActionListener{ private JPanel Panel; private GridBagConstraints gbc_btnCircle; private JButton btnCircle; public void setPanel(JPanel panel) { Panel = panel; } public Circle(JFrame frame, JPanel panel){ btnCircle = new JButton("Circle"); // some code to set grid bag constraint then frame.getContentPane().add(btnCircle, gbc_btnCircle); setPanel(panel); btnCircle.addActionListener(this); } public void paint(Graphics g) { super.paintComponents(g); g.setColor(Color.red); g.fillOval(100, 100, 100, 100); Panel.add(this); } public void actionPerformed(ActionEvent arg0) { repaint(); } } 

你有错误的想法。 在绘图面板中,您应该有一个List 。 在绘图面板的paintComponent方法中,您应该遍历列表以绘制每个圆

 class Circle { int x, int y, int width, int height; public Circle (int x, int y, int width, int height) { ... set em } public void draw(Graphics g) { g.fillOval(x, y, width, height); } } class DrawingPanel extends JPanel { List circles = new ArrayList<>(); @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (Circle circle : circles) { circle.draw(g); } } // Dont forget to override public Dimension getPreferredSize() } 

要在列表中添加更多Circles,只需在DrawingPanel类中使用addCircle方法即可

 public void addCircle(Circle circle) { circles.add(circle); repaint(); } 

对于按钮,您应该在Window类中创建它。 在ActionListener ,只需创建一个new Circle并通过调用addCircle方法将其添加到DrawingPanel


除此之外, Circle不需要扩展ShapeShape API已经有一个Ellipse2D类,你可以从中创建圆圈

 class DrawingPanel extends JPanel { List circles = new ArrayList<>(); @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g.create(); for (Ellipse2D circle : circles) { g2.fill(circle); } g2.dispose(); } // Dont forget to override public Dimension getPreferredSize() } 
  • 请参见2D图形

更新:完整的例子

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class CirclesDemo { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { new CirclesDemo(); } }); } public CirclesDemo() { JFrame frame = new JFrame(); frame.add(panel); frame.add(createButton(), BorderLayout.PAGE_END); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } private final DrawingPanel panel = new DrawingPanel(); private JButton createButton() { JButton button = new JButton("Add Circle"); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { int[] circleValues = generateRandomValues(300, 300, 50, 150); int x = circleValues[0]; int y = circleValues[1]; int width = circleValues[2]; int height = width; Circle circle = new Circle(x, y, width, height); panel.addCircle(circle); } }); return button; } private int[] generateRandomValues(int maxX, int maxY, int minSize, int maxSize) { Random random = new Random(); int[] values = new int[3]; values[0] = random.nextInt(maxX); values[1] = random.nextInt(maxY); values[2] = Math.min(random.nextInt(maxSize) + minSize, maxSize); return values; } class Circle { int x, y, width, height; public Circle(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } public void draw(Graphics g) { g.drawOval(x, y, width, height); } } class DrawingPanel extends JPanel { List circles = new ArrayList<>(); @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (Circle circle : circles) { circle.draw(g); } } public void addCircle(Circle circle) { circles.add(circle); repaint(); } @Override public Dimension getPreferredSize() { return new Dimension(400, 400); } } } 

你正在重写Circle的paint方法。 您需要覆盖面板的绘制方法。