首页 > 解决方案 > JCheckBox 组件在重新添加后不显示在 JPanel 上

问题描述

我正在尝试在包含在 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();
}

上述方法,当第一次被调用时,做我想要的,并有以下结果:

第一次调用InitTableChoices方法后的DialogBox

当我想删除所有的 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方法,我得到以下结果:

第一次调用DeleteTableChoicesInitTableChoices方法后的DialogBox

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

有谁知道为什么会这样?

标签: javaswingjpaneljscrollpanejcheckbox

解决方案


在您的initTableChoices方法行中

scrollPane = new JScrollPane(containerToScroll);

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

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

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


推荐阅读