2014-10-31 2 views
4

У меня есть класс-класс с кнопкой и классом с jPanel, что я хочу сделать, когда эта кнопка нажата на круг, будет нарисован на панели, и каждый раз, когда я нажимаю на эту кнопку и измените x и y «некоторые из них не реализованы здесь». Я снова и снова получал круг на JPanel. Как это сделать, или есть способ сделать то, что я описал, независимо от моего кода, но я хочу, чтобы классный круг расширял форму.Добавление фигур в 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();  
    } 
} 

ответ

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() 
} 

Чтобы добавить больше кругов в список, просто метод addCircle в DrawingPanel классе

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

Что касается кнопки, вы должны создать ее в классе Window. В ActionListener, просто создать new Circle и добавить его в DrawingPanel путем вызова метода addCircle


в сторону, Circle не нужно удлинять 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

Вы бы, пожалуйста, добавили изменения и до меня, почему я все еще не работаю? Я ничего не получил на своей панели, когда я нажимаю кнопку. –

+0

1) Я не вижу, где создана кнопка, и где вы добавляете 'ActionListener'. Я собираюсь предположить, чтобы полностью перечеркнуть первый класс Circle 2) Вы переопределили 'getPreferredSize'? 3) Я не вижу, чтобы вы добавляли «DrawingPanel» к фрейму. –

+0

См. Мое ** ОБНОВЛЕНИЕ ** –

1

Вы перекрывая метод рисования окружности. Вы должны переопределить метод краски панели.

+0

Как сделать что, пожалуйста? –

Смежные вопросы