2016-08-22 4 views
0

Я использую Arraylist для моих галочек. Я хочу, чтобы удалить каждый из них, когда он выбран, но мой код не выполняет ожидаемое поведение. Я не знаю, почему мой код не работает.Как удалить определенный JCheckBox, если он выбран?

Здесь:

public class sampledsa extends JFrame implements ActionListener { 

    private JCheckBox CBname; 
    private ArrayList <JCheckBox> SBname = new ArrayList < >(); 
    private JButton BTok; 

    public sampledsa() { 
     setVisible(true); 
     setSize(500, 400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(6, 1)); 

     BTok = new JButton("OK"); 

     for (int i = 0; i < 5; i++) { 
      CBname = new JCheckBox("Checkbox" + (i + 1)); 
      SBname.add(CBname); 
      add(SBname.get(i)); 
     } 

     add(BTok); 
     BTok.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource().equals(BTok)) { 
      for (int i = 0; i < SBname.size(); i++) { 
       if (SBname.get(i).isSelected()) { 
        SBname.remove(i); 
       } 
      } 
      JFrame f = new JFrame(); 
      f.setVisible(true); 
      f.setSize(500, 400); 
      f.setDefaultCloseOperation(EXIT_ON_CLOSE); 
      for (int i = 0; i < SBname.size(); i++) { 
       f.add(SBname.get(i)); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     new sampledsa(); 
    } 

} 
+1

Просто подсказка ... Классы должны начинаться с прописных букв, а переменные должны начинаться с строчных букв. – byxor

+0

Я думаю, что 'ArrayList' не поддерживает одновременные модификации. То есть вы не можете удалять элементы во время их итерации. –

+1

http://stackoverflow.com/documentation/java/90/collections/2197/removing-items-from-a-list-within-a-loop#t=201608221144205738709 – rdonuk

ответ

2

Как и другие отметили, в комментариях не следует удалять пункты в ArrayList, потому что вы не получите ожидаемого результата.

Вместо этого вы должны использовать Iterator.

Пример:

Iterator<JCheckBox> iterator = sbname.iterator(); 
while(iterator.hasNext()) { 
    JCheckBox checkbox = iterator.next(); 
    if (checkbox.isSelected()) { 
     iterator.remove(); 
     //do some more stuff 
    } 
} 
+0

Весь смысл использования итератора - это та часть, которая входит в «сделать что-то» - это удаление элемента с помощью итератора. В противном случае это не отличается от цикла 'for'. – RealSkeptic

+0

@RealSkeptic добавил его, чтобы прояснить это - подумал, что будет ясно - мой плохой – mayha

0

Используйте современные коллекции API.

SBName.removeIf(box->box.isSelected()); 

Или используйте метод ссылки.

SBName.removeIf(JCheckBox::isSelected);