2015-05-02 2 views
2

В этом коде я пытаюсь инициализировать связанный список овалов, которые отправляются в класс, который нужно нарисовать.Проблема со связанным списком (Java-апплет)

public void actionPerformed(ActionEvent e) 
    { 
    oval p; 
    Graphics g = this.getGraphics(); 
    int x, y, height, width, fill; 
    ListIterator li; 
    LinkedList<oval> list = new LinkedList<oval>(); 
    li = list.listIterator(); 
    x = Integer.parseInt(xfield.getText()); 
    y = Integer.parseInt(yfield.getText()); 
    height = Integer.parseInt(heightf.getText()); 
    width = Integer.parseInt(widthf.getText()); 
    list.add(new oval(x,y,height,width)); 
    repaint(); 
    while (li.hasNext()) 
    { 
     p = (oval)li.next(); 
     p.draw(g); 
    } 

Когда я запускаю это, я получаю это исключение:

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException 
    at java.util.LinkedList$ListItr.checkForComodification(Unknown Source) 
    at java.util.LinkedList$ListItr.next(Unknown Source) 
    at ovalapplet.actionPerformed(ovalapplet.java:97) 

Как я могу это исправить? (Линия 97 р = (овал) li.next();., Если это помогает)

+0

Зачем нужен апплет? Если это связано с тем, что учитель указал на это, обратитесь к [Почему учителя CS должны ** останавливаться ** преподавать Java-апплеты] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-учебно-ява-апплеты /). –

ответ

2

Вы итератора в списке в перед тем изменить состояние списка, а затем использовать итератор для перебора, но теперь итератор уже не подходит. Решение: измените этот порядок. Получите итератор только после добавления элементов в список или использования ListIterator и добавления элементов в ListIterator.

Другие проблемы: вы неправильно рисуете, так как вы не должны получать объект Graphics, вызывая getGraphics() на компоненте, так как это возвращает недолговечный объект. Чтобы понять, что я имею в виду, как только вы получите свой графический интерфейс, свести к минимуму, а затем восстановить его после выполнения этого чертежа и посмотреть, как ваши рисунки исчезнут. Вместо этого используйте поле LinkedList, измените его состояние в методе actionPerformed, вызовите repaint() и получите метод вашего компонента paintComponent(Graphics g) (или метод paint(Graphics g), если это программа AWT). Сделайте чертеж для вас.

+0

Спасибо. Я попытался использовать Graphics g; вместо Graphics g = this.getGraphics(); но это приводит к ошибке: «Локальная переменная g может быть не инициализирована». – Bryan

+0

@ Брайан: Пожалуйста, перечитайте мою рекомендацию. Чертеж должен выполняться в методе 'paint (...)' (if AWT) или 'paintComponent (...)' (если Swing, используя параметр Graphics, указанный для JVM-метода). –

0

Вы можете избавиться от этого, используя remove() вместо вызова next(), где вы не хотите получать доступ к объекту во время использования другой задачи, что означает отсутствие параллельного доступа.

while (li.hasNext()) 
{ 
    p = (oval)li.remove(); 
    p.draw(g); 
} 
0

Вы создаете итератор списка, прежде чем добавлять какие-либо овалы в связанный список. Но итератор не обновляется, когда новый элемент добавляется в связанный список. Вот почему возникает исключение. Чтобы исправить это, инициализируйте итератор списка после, добавив новый овал.