将圆形对象添加到Arraylist并在屏幕上显示

时间:2012-02-18 21:45:25

标签: java swing arraylist jpanel jradiobutton

这是我第二个学期做Java的学期,所以请耐心等待。我的部分工作是单击一个单选按钮,并在单击鼠标按钮时使用Circle的绘制方法在Jpanel内容窗格上绘制一个Circle对象。然后将每个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 个答案:

答案 0 :(得分:1)

你有几个问题。首先,在paintComponent函数中,您将创建一个Circles的本地ArrayList。每次调用paintComponent时,都要重新创建此变量。相反,只需使用属于该类的Circles的ArrayList。

你遇到的另一个问题是每个圆圈被绘制两次,一次是在圆圈创建之后,另一次是在for循环中。你应该删除调用以使圆圈自己绘制,然后在for循环中将它们全部绘制出来。

最后,这可能是也可能不是所需的行为,但是目前每次调用paintComponent时都会创建一个新的Circle。你最终可能会得到比你想要的更多的圈子,因为这个功能可以被大量调用。您可能想重新考虑在什么时候创建新圈子。

以下修复了前几个问题。

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
  }