链表问题(Java 小程序)

Issue with Linked List (Java applet)

在这段代码中,我试图初始化一个椭圆的链表,这些椭圆被发送到要绘制的 class。

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 行是 p = (oval)li.next();如果有帮助的话。)

你得到列表的迭代器之前你改变列表的状态,然后你使用迭代器来迭代,但是现在迭代器已经不合适了。解决方案:更改该顺序。仅在 将项目添加到列表后获取迭代器,或使用 ListIterator 并使用 ListIterator 添加项目。

其他问题:您绘制不正确,因为您不应该通过在组件上调用 getGraphics() 来获取 Graphics 对象,因为此 returns 是一个短暂的对象。为了明白我的意思,一旦你让你的 GUI 工作,最小化然后在完成这个绘图后恢复它并观察你的绘图消失。而是使用 LinkedList 字段,在 actionPerformed 方法中更改其状态,调用 repaint() 并让组件的 paintComponent(Graphics g) 方法(如果这是 AWT 程序,则使用 paint(Graphics g) 方法)为你.

您可以通过使用 remove() 而不是调用 next() 来摆脱这种情况,因为您不想在对象被其他任务使用时访问该对象,这意味着没有并发访问。

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

在将任何椭圆添加到链表之前,您正在创建列表迭代器。但是当一个新项目被添加到链接列表时,迭代器不会更新。这就是发生异常的原因。要修复它,请在 添加新椭圆后初始化列表迭代器