我正在尝试在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
的第二次调用。