JCheckBox 组件在重新添加后不显示在 JPanel 上
JCheckBox components doesn't show on JPanel after re adding them
我正在尝试在 JDialogBox.Here 中包含的 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 而没有显示其他的。
有人知道为什么会这样吗?
在您的 initTableChoices
方法行中
scrollPane = new JScrollPane(containerToScroll);
将添加 containerToScroll
作为 scrollPane
组件的子项。
当你运行 initTableChoices
第二次时,containerToScroll
将被分配给一个new JScrollPane
实例但是这个新的 JScrollPane
实例未添加到组件层次结构中。因此,您实际上是从组件层次结构中删除 containerToScroll
。
我的建议是将实际向 containerToScroll
添加复选框的循环提取到新方法中,让 initTableChoices
调用此方法,并替换 initTableChoices
的第二次调用调用新方法。
我正在尝试在 JDialogBox.Here 中包含的 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 而没有显示其他的。
有人知道为什么会这样吗?
在您的 initTableChoices
方法行中
scrollPane = new JScrollPane(containerToScroll);
将添加 containerToScroll
作为 scrollPane
组件的子项。
当你运行 initTableChoices
第二次时,containerToScroll
将被分配给一个new JScrollPane
实例但是这个新的 JScrollPane
实例未添加到组件层次结构中。因此,您实际上是从组件层次结构中删除 containerToScroll
。
我的建议是将实际向 containerToScroll
添加复选框的循环提取到新方法中,让 initTableChoices
调用此方法,并替换 initTableChoices
的第二次调用调用新方法。