0

这是我学习 Java 的第二个学期,所以请耐心等待。我的部分任务是单击单选按钮并使用 Circle 的 draw 方法在单击鼠标按钮时在 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;` 
4

1 回答 1

1

你有几个问题。首先,在您的paintComponent 函数中,您正在创建一个本地的Circles ArrayList。每次调用paintComponent 时,您都在重新创建此变量。相反,只需使用属于该类的圆的 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
  }
于 2012-02-18T22:42:43.607 回答