Мне нужно очистить мой JPanel
. Этот JPanel
, называемый mainPane
, имеет GridLayout
, который содержит JScrollPane's, and these
JScrollPane s contain custom
JPanel s that override
paintComponent () `.
Независимо от того, что я пытаюсь - установив в списке значение null, заменив старый экземпляр новым объектом, - как только я изменю размер рамки окна, вызывается представление paintComponent()
get, и оно рисует представления внутри mainPane
еще раз.
public void createContentPane()
{
gridLay = new GridLayout(GRID_ROWS, GRID_COLUMNS);
graphicViewList = new ArrayList<View>();
for (int i = 0; i < graphicViewList.size(); i++) {
View v = graphicViewList.get(i);
v = null;
}
mainPane = new JPanel();
clearGrid();
mainPane.removeAll();
mainPane.validate();
graphicViewList.clear();
imageModel.deleteObservers();
mainPane.setLayout(gridLay);
this.getContentPane().remove(mainPane);
this.getContentPane().add(mainPane, BorderLayout.CENTER);
mainPane.revalidate();
mainPane.repaint();
}
public void createViews()
{
int idx = 0;
graphicViewList.clear();
while(idx < NUM_PERSPECTIVE) //iterator?
{
if(idx == 0)
{
graphicViewList.add(new ThumbnailView(this, imageModel));
mainPane.add(new JScrollPane(graphicViewList.get(idx)));
idx++;
continue;
}
graphicViewList.add(new ImageView(this, imageModel));
mainPane.add(new JScrollPane(graphicViewList.get(idx)));
idx++;
}
for (int i = 0; i < graphicViewList.size(); i++)
graphicViewList.get(i).removeFocus();
this.getContentPane().add(mainPane, BorderLayout.CENTER);
}
private void clearGrid()
{
for (int i = 0; i < mainPane.getComponentCount(); i++) {
JScrollPane sP =(JScrollPane) mainPane.getComponent(i);
sP = null;
}
}
createContentPane()
это слишком, я знаю, я просто в отчаянии. Таким образом, в основном первая функция и вторая функция вызывается в конструкторе GUI. Когда я вызываю createContentPane()
для замены старого пользовательского интерфейса (с той же структурой, просто с другим содержимым), как только я изменяю размер контейнера, его содержимое рисуется заново. Единственное отличие состоит в том, что при втором вызове createContentPane()
рисование с изменением размера обращается к макету, а элементы больше не находятся внутри.
Я бы подумал, что createContentPane()
очистит все и удалит все ссылки, которые у меня могут быть, но paintComponent()
все-таки удастся нарисовать полосы прокрутки с представлениями.