我正在尝试在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。
有人知道为什么会这样吗?
答案 0 :(得分:1)
在您的initTableChoices
方法行中
scrollPane = new JScrollPane(containerToScroll);
会将containerToScroll
添加为scrollPane
组件的子代。
第二次运行initTableChoices
时,containerToScroll
将分配给一个新 JScrollPane
实例,但此新的JScrollPane
实例却未被分配添加到组件层次结构中。结果,您正在有效地从组件层次结构中删除containerToScroll
。
我的建议是将实际上将复选框添加到containerToScroll
的循环提取到新方法中,让initTableChoices
调用此方法,并将第二次调用initTableChoices
替换为调用新方法。