2014-10-31 73 views
4

我有一個類按鈕和一個類與一個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();  
    } 
} 

回答

6

你有點錯誤的想法。在你的繪圖面板中,你應該有一個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

1

要覆蓋圈的paint方法。您需要重寫面板的繪製方法。

+0

怎麼辦那,請嗎? – 2014-10-31 15:59:47

相關問題