在一个按钮上添加形状到JPanel点击

问题描述:

我有一个类按钮和一个类与一个jPanel我想要做的是当该按钮被点击一个圆形将被绘制在面板上,每次我点击按钮,并更改x和y“一些如何不在这里实现”我一遍又一遍地在JPanel上有一个圆圈。 如何做到这一点,或者是否有办法做到我描述的内容,而不管我的代码如何,但我希望类圆扩展Shape。在一个按钮上添加形状到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); 
} 

然后Circle类

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<Circle>。而在拉丝面板的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<Circle> 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() 
} 

要更圆添加到列表中,只是在DrawingPaneladdCircle方法

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

就按钮而言,您应该在Window课程中创建它。在ActionListener,只需创建一个new Circle,并通过调用addCircle方法


旁白添加它的DrawingPanelCircle不需要延长Shape。该Shape API已经有一个Ellipse2D类,你可以从

class DrawingPanel extends JPanel { 
    List<Ellipse2D> 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() 
} 

UPDATE:完整的例子

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<Circle> 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); 
     } 
    } 
} 
+0

你会看起来添加编辑,直到我为什么我仍然不工作?当我点击按钮时,我的面板上没有任何东西。 – 2014-10-31 17:22:05

+0

1)我看不到按钮的创建位置以及添加“ActionListener”的位置。我将假设完全抛弃第一个Circle类2)您是否覆盖'getPreferredSize'? 3)我没有看到你添加'DrawingPanel'到框架。 – 2014-10-31 17:25:23

+0

查看我的**更新** – 2014-10-31 17:43:18

要覆盖圈的paint方法。您需要重写面板的绘制方法。

+0

怎么办那,请吗? – 2014-10-31 15:59:47