2013-03-22 3 views
1

Я использовал этот answer, чтобы динамически добавлять кнопки в мой графический интерфейс и, как ожидается, также сможет удалить все из них. Насколько я понимаю, я получаю все ключи в HashMap (строки), а затем я делаю цикл for над ключами и удаляю их из 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 

Выход:

Name0: Cancel 
Name0: Continue 
2 
before removing: Cancel 
true 
after removing: Cancel 
+2

Если набор ключей связан с HashMap вы, вероятно, получите исключение ConcurrentModification. В этом случае просто скопируйте набор и выполните итерацию по скопированному набору. – Paranaix

ответ

1

Если вы хотите удалить из HashMap, вам необходимо удалить его с помощью итератора.
См. Calling remove in foreach loop in Java.

EDIT: В соответствии с ОП ...

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); 
+0

Я просто попытался использовать итератор и получил тот же результат. Позвольте мне попробовать еще раз и подтвердить с помощью кода. – Juan

+0

@ Juan также попробуйте прокомментировать visualUI.remove (b); линия. Я не уверен, что это делает, но это скажет вам, есть ли у вас проблема. Также попробуйте опубликовать исключение, которое вы получите. –

+0

Хорошо, я думаю, что с небольшим перетасовкой мне удается это сделать. Вы можете добавить этот код к своему ответу, если хотите: Итератор it = names.iterator(); while (it.hasNext()) { System.out.println (имена); String buttonName = it.next(); JButton b = buttonCache.get (buttonName); it.remove(); } System.out.println (имена); – Juan

0

Просто догадка. Когда вы удаляете кнопку из Hashmap, ее, возможно, еще можно найти в пользовательском интерфейсе и больше не ссылается на нее. Возможно, это одна проблема. Я вижу прокомментированные строки, которые должны позаботиться о том, чтобы удалить кнопки из пользовательского интерфейса в вашем snippit - я думаю, вы должны позволить им это сделать и посмотреть, что будет потом.