Компоненты JCheckBox не отображаются на JPanel после их добавления
Я пытаюсь сделать список JCheckBox внутри JScrollPanel, который содержится в JDialogBox. Вот мой код:
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();
}
Приведенный выше метод, когда вызывается впервые, делает то, что я хочу, и имеет следующий результат:
DialogBox после первого вызова метода InitTableChoices
Когда я хочу удалить все 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, и у меня есть следующий результат:
DialogBox после вызова методов DeleteTableChoices и InitTableChoices после первого раза
Так что он показывает только первый JCheckBox, который у меня есть в списке, но не показывает остальные.
У кого-нибудь есть идеи, почему это происходит?
1 ответ
В вашем initTableChoices
метод строки
scrollPane = new JScrollPane(containerToScroll);
добавлю containerToScroll
как дитя scrollPane
составная часть.
Когда ты бежишь initTableChoices
второй раз, containerToScroll
будет назначен на новый JScrollPane
экземпляр, но этот новый JScrollPane
Экземпляр не добавляется в иерархию компонентов. В результате вы эффективно удаляете containerToScroll
из вашей иерархии компонентов.
Мое предложение было бы извлечь цикл, который фактически добавляет флажки для containerToScroll
в новый метод, есть initTableChoices
вызовите этот метод и замените второй вызов initTableChoices
с вызовом нового метода.