2014-03-25 28 views
-1

我在我的xy它们是其中i点击我的鼠标的坐标值加上使用队列。但是,当我尝试使用Iterator访问值时出现错误。有人能帮助我吗?我如何以正确的方式做到这一点?另外,我不知道TimerActionlistener对我的代码有什么作用(它们是否需要或者我必须删除它?),所以稍加说明对我来说就非常有用。我希望你能帮我修复和改进这些代码。谢谢! :)如何正确使用Java中的迭代器从队列中获取价值?

public class Canvas extends JPanel implements MouseListener, ActionListener{ 

Timer time; 
int numberOfPoints; 
Queue<Integer> x = new LinkedList<Integer>(); 
Queue<Integer> y = new LinkedList<Integer>(); 
Iterator itX = x.iterator(); 
Iterator itY = y.iterator(); 
public Canvas(){ 
    addMouseListener(this); 
    time = new Timer(1, this); 
    time.start();  
    numberOfPoints = 5; 

} 

public void paint (Graphics g){ 
    super.paint(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setBackground(Color.black); 
    g2d.drawString("Left: "+ numberOfPoints, 10, 20); 
    g2d.fillOval(220, 170, 30, 30); 
    g2d.setColor(Color.red);  
    while(itX.hasNext()){ 
     Integer xx = (Integer) itX.next(); 
     Integer yy = (Integer) itY.next(); 
     g2d.fillOval(xx, yy, 30, 30); 
    } 
} 

public void mousePressed(MouseEvent e) {   
    if(numberOfPoints>0){ 
     numberOfPoints--; 
     x.add(e.getX()-15); 
     y.add(e.getY()-15); 
     repaint(); 
    } 

} 

public void mouseReleased(MouseEvent e) {} 

public void mouseClicked(MouseEvent e) {} 

public void mouseEntered(MouseEvent e) {} 

public void mouseExited(MouseEvent e) {} 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    repaint(); 

} 

}

总之,这里的的情况下,要运行它在我的主类。

public class ClikkPanikk extends JFrame{ 

public ClikkPanikk(){ 
    short width = 500; 
    short height = 400; 
    add(new Canvas()); 
    setTitle("ClikkPanikk"); 
    setVisible(true); 
    setSize(width, height); 
    setResizable(false); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 

public static void main(String[] args) { 
    new ClikkPanikk(); 
} 

}

回答

0

您所创建的迭代器作为一个领域,而不是仅仅使用前。正因为如此,迭代器注意到这些值自创建以来已经发生了变化,并引发了一个并发修改异常。就像你的while循环之前

初始化你的迭代器:

itX = x.iterator(); 
itY = y.iterator(); 
while(itX.hasNext()){ 
    Integer xx = (Integer) itX.next(); 
    Integer yy = (Integer) itY.next(); 
    g2d.fillOval(xx, yy, 30, 30); 
} 

此外,断章取义我可能是错的(我没有经历过所有的代码了),但你不应该需要投给一个Integer对象,你可以只设置一个Integer对象,以原始的int类型:

Integer varName = 12; 

将创造的价值12 Integer对象,所以不必要的铸造只是余地编译错过致命错误。

+0

救了我。谢啦! :) –