Я использовал очередь для добавления значений для моих 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 ответ
Вы создаете итератор как поле, а не непосредственно перед его использованием. Из-за этого итератор замечает, что значения изменились с момента его создания, и выдает исключение одновременного изменения.
Инициализируйте итератор непосредственно перед циклом 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, поэтому ненужное приведение просто оставляет место для компилятора, чтобы пропустить фатальные ошибки.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].