这是我第二个学期做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;`
答案 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
}