Java JCheckbox未正确卸下

Java JCheckbox未正确卸下,java,swing,Java,Swing,今天早上我问了一个关于JCheckbox的问题,但被告知要缩小问题的范围。 经过几次调试,我缩小了问题的范围,但仍然无法解决 似乎如果我选择一个JCheckbox和另一个不是后续JCheckbox的JCheckbox,它们都将被删除。 (例如,如果我在位置0和2或3处选择JCheckbox,则两者都将被删除) 但是,如果我选择一个JCheckbox,然后选择下一个JCheckbox,它将只删除第一个JCheckbox(例如,如果我在位置0和1处选择JCheckbox,则仅删除位置0处的JChec

今天早上我问了一个关于JCheckbox的问题,但被告知要缩小问题的范围。 经过几次调试,我缩小了问题的范围,但仍然无法解决

似乎如果我选择一个JCheckbox和另一个不是后续JCheckbox的JCheckbox,它们都将被删除。 (例如,如果我在位置0和2或3处选择JCheckbox,则两者都将被删除)

但是,如果我选择一个JCheckbox,然后选择下一个JCheckbox,它将只删除第一个JCheckbox(例如,如果我在位置0和1处选择JCheckbox,则仅删除位置0处的JCheckbox)

我如何解决这个问题

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class CheckBoxTest extends JPanel {

    JButton deleteBtn = new JButton("Delete!");
    List<JCheckBox> checkboxes = new ArrayList<JCheckBox>();

    public CheckBoxTest() {
        setLayout(new GridLayout(0, 1));
        for(int i = 0; i < 4; i++) {
            checkboxes.add(new JCheckBox());
            checkboxes.get(i).setText("text" + i);
            add(checkboxes.get(i));
        }
        add(deleteBtn);
        deleteBtn.addActionListener(new DeleteBtnActionPerformed());
    }

    public class DeleteBtnActionPerformed implements ActionListener {   

        @Override
        public void actionPerformed(ActionEvent e) {
            for(int i = 0; i < checkboxes.size(); i++) {
                if(checkboxes.get(i).isSelected()) {
                    System.out.println(checkboxes.get(i).getText() + " was deleted");
                    checkboxes.remove(i);       
                }
            }   
        } 
    }

    public static void main(String[]args) { 
        JFrame frame = new JFrame();
        frame.add(new CheckBoxTest());
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setSize(400,250);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
@抑制警告(“串行”)
公共类CheckBoxTest扩展了JPanel{
JButton deleteBtn=新JButton(“删除!”);
列表复选框=新建ArrayList();
公共CheckBoxTest(){
setLayout(新的GridLayout(0,1));
对于(int i=0;i<4;i++){
添加(新的JCheckBox());
复选框.get(i).setText(“text”+i);
添加(复选框。获取(i));
}
添加(删除BTN);
deleteBtn.addActionListener(新的DeleteBtnActionPerformed());
}
公共类DeleteBtnActionPerformed实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
对于(int i=0;i

您忘记保留正确的i。

使用
迭代器来循环检查您的复选框并同时删除元素。对于这样的用例,这是一个很好的实践

for(Iterator<JCheckBox> iterator = checkboxes.iterator(); iterator.hasNext();) {
    JCheckBox checkbox = iterator.next();
    if (checkbox.isSelected()) {
        System.out.println(checkbox.getText()
                + " was deleted");
        iterator.remove();
    }
}
for(迭代器迭代器=复选框。迭代器();迭代器。hasNext();){
JCheckBox checkbox=iterator.next();
if(checkbox.isSelected()){
System.out.println(checkbox.getText()
+“已删除”);
iterator.remove();
}
}
for(Iterator<JCheckBox> iterator = checkboxes.iterator(); iterator.hasNext();) {
    JCheckBox checkbox = iterator.next();
    if (checkbox.isSelected()) {
        System.out.println(checkbox.getText()
                + " was deleted");
        iterator.remove();
    }
}