Я использовал очередь для добавления значений для моих x и y, которые являются координатами того места, где я щелкнул мышью. Однако при попытке получить доступ к значениям с помощью Iterator у меня возникла ошибка. Кто-нибудь может мне помочь? Как мне это сделать правильно? Кроме того, я не знаю, что Timer и Actionlistener делают с моим кодом (нужны ли они или мне нужно это удалить?), Поэтому небольшое пояснение будет мне очень полезно. Надеюсь, вы поможете мне исправить и улучшить эти коды. Спасибо! :)

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();
}

}

-1
Kev Nish 25 Мар 2014 в 07:28

1 ответ

Лучший ответ

Вы создаете итератор как поле, а не непосредственно перед его использованием. Из-за этого итератор замечает, что значения изменились с момента его создания, и выдает исключение одновременного изменения.

Инициализируйте итератор непосредственно перед циклом 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;

Создаст объект Integer со значением 12, поэтому ненужное приведение просто оставляет место для компилятора, чтобы пропустить фатальные ошибки.

0
Harry Clarke 25 Мар 2014 в 08:06