Добавление объекта Circle в Arraylist и отображение на экране - PullRequest
0 голосов
/ 19 февраля 2012

Это мой второй семестр по Java, поэтому, пожалуйста, будьте терпеливы. Часть моего задания - щелкнуть переключатель и использовать метод рисования круга, чтобы нарисовать объект круга на панели содержимого Jpanel при нажатии кнопки мыши. Затем сохраните каждый объект Circle в Arraylist, чтобы он оставался на панели, пока я не нажму кнопку-переключатель. Я могу заставить все работать, кроме добавления объекта Circle в Arraylist и удержания этого круга на экране. Он будет рисовать только один круг за раз и стирает первый предыдущий, когда я нажимаю снова. Я не думаю, что я добавляю новые круги, созданные в Arraylist, я просто круг. Не уверен.

Вот мой код для части, которая рисует круг.

public class MyPanel extends JPanel {

  public ArrayList<Circle> circles; 

  public void paintComponent(Graphics g) {
    Circle c = new Circle(xstart, ystart);   //create a new circle
    ArrayList<Circle> circles = new ArrayList<Circle>();
    if (drawing){ 
        c.draw(g);
        circles.add(c);
        for(int k=0; k<circles.size(); k++){
            circles.get(k).draw(g);
            }
    }           // draw the circle

Код для рисования и объявления рисования логическим в моем конструкторе MouseTest и привязанный к переключателю. Рисование true означает, что при нажатии кнопки-переключателя он может рисовать круги.

JPanel radioPanel = new JPanel(new GridLayout(2,0)); //new GridLayout(y, x)
radioPanel.add(circleButton);
radioPanel.add(trackButton);    
cp.add(radioPanel,BorderLayout.EAST);
drawing = false;

circleButton.addActionListener(new ActionListener() { 
//Set drawing to true when the button is clicked
        public void actionPerformed(ActionEvent ae) {
            drawCircles();
        }

    }); 

 public void drawCircles() {    //initialize tracking to false
    drawing = !drawing;` 

1 Ответ

1 голос
/ 19 февраля 2012

У вас есть пара вопросов. Во-первых, в вашей функции paintComponent вы создаете локальный ArrayList of Circles. Каждый раз, когда вызывается paintComponent, вы воссоздаете эту переменную. Вместо этого просто используйте ArrayList of Circles, который принадлежит классу.

Другая проблема, с которой вы столкнулись, заключается в том, что каждый круг рисуется дважды: один раз после создания круга, другой раз в цикле for. Вы должны удалить вызов, чтобы круг нарисовал себя, и просто нарисовать их все в цикле for.

Наконец, и это может или не может быть желаемым поведением, но в настоящее время вы создаете новый круг каждый раз, когда вызывается paintComponent. Вы можете потенциально получить гораздо больше кругов, чем хотите, потому что эту функцию можно вызывать много раз. Вы можете пересмотреть вопрос о том, в какой момент создаются новые круги.

Следующее исправляет первую пару проблем.

public class MyPanel extends JPanel {

  public ArrayList<Circle> circles = new ArrayList<Circle>(); 

  public void paintComponent(Graphics g) {

    Circle c = new Circle(xstart, ystart);   //create a new circle
    circles.add(c);
    if (drawing){  
        for(int k=0; k<circles.size(); k++){
            circles.get(k).draw(g);
        }
    }           // draw the circle
  }
...