Компоненты 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 с вызовом нового метода.

Другие вопросы по тегам