重新添加JCheckBox组件后,它们不会显示在JPanel上

时间:2018-07-19 10:06:11

标签: java swing jpanel jscrollpane jcheckbox

我正在尝试在JScrollBox中包含一个JDialogBox列表中创建一个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

当我想删除所有JCheckBox来创建一些新的JCheckBox并在以后调用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。

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

1 个答案:

答案 0 :(得分:1)

在您的initTableChoices方法行中

scrollPane = new JScrollPane(containerToScroll);

会将containerToScroll添加为scrollPane组件的子代。

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

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