java - JCheckbox 未正确删除

标签 java swing

今天早上我问了一个有关 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);
    }
}

最佳答案

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

for(Iterator<JCheckBox> iterator = checkboxes.iterator(); iterator.hasNext();) {
    JCheckBox checkbox = iterator.next();
    if (checkbox.isSelected()) {
        System.out.println(checkbox.getText()
                + " was deleted");
        iterator.remove();
    }
}

关于java - JCheckbox 未正确删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25330361/

相关文章:

java - 小程序未找到类异常

java - 在边框布局中的组件顶部(z 顺序)添加 JComponent

java - SwingWorker publish()/process() 就像 done()

java - Blackberry[CodeNameone]- 在屏幕上绘图

java - Hibernate不会创建表,即使它在sql中显示

java - 使用 Java 匹配具有指定属性的对象

java - ClassCastException 的未知来源(在 JTables 中)

java - RED5 和 RTSP 流媒体

java - 使用 Guava 的 future 可迭代?

Swing 中的 Java 任务进度条