2012-02-18 102 views
0

这是我的第二个学期Java,因此请耐心等待。我的任务之一是单击单选按钮,并在单击鼠标按钮时使用Circle的绘制方法在Jpanel内容窗格上绘制Circle对象。然后将每个Circle对象存储在Arraylist中,以便它保留在窗格上,直到我取消单选按钮。除了将Circle对象添加到Arraylist并在屏幕上保留该圆之外,我可以让所有的工作都可以工作。当我再次点击时,它将一次只绘制一个圆圈并清除前一个圆圈。我不认为我在为Arraylist创建新的圈子,我只是一个圈子。不确定。将Circle对象添加到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构造函数中绘制和声明图形的代码并绑定到单选按钮。绘制正确意味着当单选按钮被点击时,它可以绘制圆圈。

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;` 
+0

我将代码和一些细节添加到了我的原始发布的图纸。 – handro 2012-02-18 22:12:14

回答

1

你有几个问题。首先,在你的paintComponent函数中,你正在创建一个圈子的本地ArrayList。每次调用paintComponent时,都会重新创建此变量。相反,只需使用属于该类的Circle的ArrayList即可。

你拥有的另一个问题是,每个圆圈被绘制两次,在创建圈子后一次,另一次在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 
    } 
+0

就是这样。我在想我必须先画圈,但现在我看到我已经创建了一个新的圈子。并存储在Arraylist中,然后.draw(g)将其绘制。非常感谢你!! – handro 2012-02-18 23:03:55