Java 动态删除所有按钮

Java 动态删除所有按钮,java,swing,Java,Swing,我用它动态地向GUI中添加按钮,并希望能够删除所有按钮。据我所知,我正在获取HashMap中的所有键(字符串),然后在键上执行for循环,并从HashMap中删除它们(获取我将删除的对象)。问题是从hashmap中删除第一个按钮后,循环不会继续,我的应用程序会崩溃 HashMap<String, JButton> buttonCache = new HashMap<>(); Set<String> names = buttonCache.keySet();

我用它动态地向GUI中添加按钮,并希望能够删除所有按钮。据我所知,我正在获取HashMap中的所有键(字符串),然后在键上执行for循环,并从HashMap中删除它们(获取我将删除的对象)。问题是从hashmap中删除第一个按钮后,循环不会继续,我的应用程序会崩溃

HashMap<String, JButton> buttonCache = new HashMap<>();
Set<String> names = buttonCache.keySet();
    /*
     * Checking which buttons exist in the hashmap
    */
    for (String name0 : names) {
        System.out.println("Name0: " + name0);
    }

    for (String name1 : names) {
        System.out.println("before removing: " + name1);
        buttonCache.containsKey(name1); //making sure its in it.
        JButton b = buttonCache.remove(name1);
        System.out.println("after removing: " + name1);
        //visualUI.remove(b); //not tested yet
    }
    //visualUI.invalidate();  //not tested yet
    //visualUI.repaint();     //not tested yet

只是猜测而已。当您从Hashmap中删除按钮时,它可能仍然会在UI中找到,并且不再有任何引用。也许这是一个问题。我看到了一些注释行,它们应该注意从snippit的UI中删除按钮——我想你应该让它们这样做,然后看看会发生什么

只是一个猜测。当您从Hashmap中删除按钮时,它可能仍然会在UI中找到,并且不再有任何引用。也许这是一个问题。我看到了一些注释行,它们应该注意从snippit的UI中删除按钮——我想你应该让它们这样做,然后看看会发生什么

如果要从HashMap中删除,需要借助迭代器进行删除。

编辑:根据OP

Iterator<String> it = names.iterator(); 
while(it.hasNext()) { 
  System.out.println(names); 
  String buttonName = it.next(); 
  JButton b = buttonCache.get(buttonName); 
  it.remove(); 
} 
System.out.println(names);
Iterator it=names.Iterator();
而(it.hasNext()){
System.out.println(名称);
String buttonName=it.next();
JButton b=buttonCache.get(buttonName);
it.remove();
} 
System.out.println(名称);

如果要从HashMap中删除,需要借助迭代器进行删除。

编辑:根据OP

Iterator<String> it = names.iterator(); 
while(it.hasNext()) { 
  System.out.println(names); 
  String buttonName = it.next(); 
  JButton b = buttonCache.get(buttonName); 
  it.remove(); 
} 
System.out.println(names);
Iterator it=names.Iterator();
而(it.hasNext()){
System.out.println(名称);
String buttonName=it.next();
JButton b=buttonCache.get(buttonName);
it.remove();
} 
System.out.println(名称);

如果键集链接到HashMap,则可能会出现ConcurrentModification异常。在这种情况下,只需复制集合并在复制的集合上迭代。如果键集链接到HashMap,则可能会出现ConcurrentModification异常。在本例中,只需复制集合并对复制的集合进行迭代,我只是尝试使用迭代器,得到了相同的结果。让我再试一次,并用代码确认。@Juan还尝试注释出visualUI.remove(b);线路。我不知道这是怎么回事,但这会告诉你你的问题是否在那里。也试着发布你得到的异常。好吧,我想通过一点洗牌,我成功地做到了。如果需要,可以将此代码添加到答案中:Iterator it=names.Iterator();while(it.hasNext()){System.out.println(名称);String buttonName=it.next();JButton b=buttonCache.get(buttonName);it.remove();}System.out.println(名称);我只是尝试了一个迭代器,得到了相同的结果。让我再试一次,并用代码确认。@Juan还尝试注释出visualUI.remove(b);线路。我不知道这是怎么回事,但这会告诉你你的问题是否在那里。也试着发布你得到的异常。好吧,我想通过一点洗牌,我成功地做到了。如果需要,可以将此代码添加到答案中:Iterator it=names.Iterator();while(it.hasNext()){System.out.println(名称);String buttonName=it.next();JButton b=buttonCache.get(buttonName);it.remove();}System.out.println(名称);