Добавление объекта Circle в список массивов и отображение на экране

Это мой второй семестр, посвященный Java, поэтому, пожалуйста, наберитесь терпения. Частью моего задания является нажатие радиокнопки и использование метода рисования Circle для рисования объекта Circle на панели содержимого 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;` 

person handro    schedule 18.02.2012    source источник
comment
Я добавил код и несколько деталей в свою исходную публикацию о том, что такое рисунок.   -  person handro    schedule 19.02.2012


Ответы (1)


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

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

Наконец, и это может быть или не быть желаемым поведением, но в настоящее время вы создаете новый Circle каждый раз, когда вызывается 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
  }
person Tony    schedule 18.02.2012
comment
Вот оно. Я думал, что мне нужно сначала нарисовать круг, но теперь я вижу, что уже создал новый круг. и сохранил это в Arraylist, а затем .draw(g) нарисовал его. большое тебе спасибо!! - person handro; 19.02.2012