JCheckBox 组件在重新添加后不显示在 JPanel 上

JCheckBox components doesn't show on JPanel after re adding them

我正在尝试在 JDialogBox.Here 中包含的 JScrollPanel 中创建一个 JCheckBox 列表是我的代码:

public void initTableChoices(DatabaseInit db){

    checkList = new ArrayList<>();

    //containerToScroll is the JPane, with boxLayout, that contains all the JCheckBoxes

    scrollPane = new JScrollPane(containerToScroll); 
    scrollPane.setSize((this.getSize().width/2),this.getSize().height - 10);
    scrollPane.setLocation((ExportDialogBox.getSize().width)/2, 0);

    ExportDialogBox.setSize(defaultSize);

    for(int i = 0; i < db.numberOfTables; i++){

        checkList.add(new JCheckBox(db.fileNames[i], false));
        containerToScroll.add(checkList.get(i));

    }

    ExportDialogBox.add(scrollPane, BorderLayout.CENTER);

    containerToScroll.revalidate();
    containerToScroll.repaint();
    containerToScroll.updateUI();
    scPane.revalidate();
    scPane.repaint(); 
    ExportDialogBox.revalidate();
    ExportDialogBox.repaint();
}

上述方法在第一次调用时会执行我想要的操作并产生以下结果:

The DialogBox after calling the method InitTableChoices for the first time

当我想删除所有的 JCheckBoxes 以创建几个新的 JCheckBoxes,然后调用 initTableChoices 方法来绘制它们时,我首先调用以下方法将它们删除:

    public void deleteTableChoices(DatabaseInit db){


    checkList.removeAll(checkList);
    containerToScroll.removeAll();

    scPane.revalidate();
    scPane.repaint();
    containerToScroll.revalidate();
    containerToScroll.repaint();
    ExportDialogBox.revalidate();
    ExportDialogBox.repaint();

}

然后再次调用InitTableChoices方法,结果如下:

The DialogBox after calling the methods DeleteTableChoices and InitTableChoices after the first time

所以它只显示我在列表中的第一个 JCheckBox 而没有显示其他的。

有人知道为什么会这样吗?

在您的 initTableChoices 方法行中

scrollPane = new JScrollPane(containerToScroll);

将添加 containerToScroll 作为 scrollPane 组件的子项。

当你运行 initTableChoices第二次时,containerToScroll将被分配给一个new JScrollPane实例但是这个新的 JScrollPane 实例未添加到组件层次结构中。因此,您实际上是从组件层次结构中删除 containerToScroll

我的建议是将实际向 containerToScroll 添加复选框的循环提取到新方法中,让 initTableChoices 调用此方法,并替换 initTableChoices 的第二次调用调用新方法。