Swing - после setVisible (false) остается место - PullRequest
0 голосов
/ 02 июня 2019

У меня есть внешняя JPanel, в которой содержится список внутренних панелей. Мой макет GridLayout

В определенных условиях я хочу невидимые некоторые из моих внутренних панелей. Проблема в том, что после того, как я установил setVisible (false) на некоторых из моих внутренних панелей, они исчезают, но их прежнее занятое пространство все еще остается и, следовательно, не стирается, оно создает пробелы.

Как убрать эти пробелы и сделать так, чтобы все видимые внутренние панели сортировались одна за другой без пробелов между ними?

outerPanel.setLayout(new GridLayout(4, 1));
outerPanel.add(pnl1);
outerPanel.add(pnl2);
outerPanel.add(pnl3);
outerPanel.add(pnl4);

private void invisibleSome(){
 Component[] cmpts = outerPanel.getComponents();
   for(int i = 0; i< cmpts.length; i++){
       //this make some components invisible 
       //but their white space still remains
       cmpts[i].setVisible(i%2 == 0);
   }
}

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Я использовал BoxLayout и моя проблема решена:

outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));
0 голосов
/ 02 июня 2019

Настройка видимости панелей не удалит их из вашей сетки.

Вы должны попытаться удалить их из сетки, используя это: https://docs.oracle.com/javase/7/docs/api/java/awt/GridLayout.html#removeLayoutComponent(java.awt.Component)

После этого вам, возможно, придется установить предпочтительный размер ячейки, чтобы она стала меньше и между ними не было пустого пространства. Другим способом было бы обновить все панели ниже, чтобы переместиться на одну ячейку вверх.

Используя второй метод, вероятно, было бы легче сохранить те, которые вы хотите отобразить в списке, удалить тот, который вы хотите из списка, удалить все панели из макета и построить совершенно новый макет из списка. панели, которые вы хотите отобразить.

...