我正在尝试在JDialogBox中包含的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,而未显示其他JCheckBox。

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

最佳答案

在您的initTableChoices方法行中

scrollPane = new JScrollPane(containerToScroll);


containerToScroll添加为scrollPane组件的子代。

第二次运行initTableChoices时,会将containerToScroll分配给新的JScrollPane实例,但是不会将此新的JScrollPane实例添加到组件层次结构中。结果,您正在有效地从组件层次结构中删除containerToScroll

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

07-27 13:43