Принуждение JPanel с GridLayout к обновлению/изменению размера

У меня есть фрейм с BorderLayout. В центре BorderLayout есть JPanel с GridLayout. Иногда мне приходится менять этот внутренний GridLayout JPanel с 9x9 на 4x4 (или 16x16). Но, к сожалению, размер ячеек остается прежним. После изменения размера кадра вручную макет адаптирует размеры, и он снова выглядит правильно. Вот как это выглядит после перехода на 4x4 и после изменения размера:

после перехода с 9x9 на 4x4

после изменения размера кадра

Как заставить внутреннюю панель автоматически обновляться? Я пробовал repaint() на внутренней панели (той, что с GridLayout) и рамке. На данный момент я использую этот код, который имеет некоторые неприятные побочные эффекты:

Dimension size = frame.getSize();
frame.setSize(new Dimension(size.height, size.width+1));
frame.setSize(size);

Есть ли другие способы добиться этого? Заранее спасибо!


person user4758246    schedule 19.07.2014    source источник
comment
Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный, полный, проверяемый пример).   -  person Andrew Thompson    schedule 19.07.2014
comment
Иногда мне приходится изменять GridLayout этого внутреннего JPanel с 9x9 на 4x4 (или 16x16). Используйте CardLayout для переключения между ними.   -  person Andrew Thompson    schedule 19.07.2014
comment
Это вариант, но он не работает для меня, потому что у меня есть объект модели (судоку), который отображается в этом представлении, и я думаю, что было бы плохим решением проверить каждый объект, если он был 4x4, 9x9 или 16x16, а затем загрузить и отобразите вид фитинга.   -  person user4758246    schedule 22.07.2014
comment
Ваш ответ заставляет меня думать, что вы имели слабое представление о том, что я предлагал!   -  person Andrew Thompson    schedule 23.07.2014
comment
Я думаю, что мы, возможно, говорим мимо друг друга. Я понял, что вы предложили использовать CardLayout для переключения между тремя GridLayouts с 4x4, 9x9 и 16x16. Я хочу отобразить один объект Sudoku в графическом интерфейсе. Если бы у меня было три GridLayout внутри CardLayout, я должен был проверить, является ли это судоку 4x4, 9x9 или 16x16, а затем выбрать GridLayout, который подходит. Но на самом деле я хочу, чтобы только один GridLayout отображал все размеры. Это ты предлагал?   -  person user4758246    schedule 26.07.2014


Ответы (1)


После ручного изменения размера кадра макет адаптирует размеры, и он снова выглядит правильно.

person Braj    schedule 19.07.2014
comment
Большое спасибо, для моей цели достаточно просто вызвать setVisible(true). - person user4758246; 19.07.2014
comment
@ user3158988: Если одного setVisible() достаточно, то вы, должно быть, ошибаетесь, думая таким образом. Совет в ответе стоит записать и запомнить наизусть :-) - person nIcE cOw; 19.07.2014
comment
Я попытался использовать pack(), потому что это звучало как очень полезная функция, но она изменял размер каждой ячейки в отношении ширины к высоте примерно 6:1, что выглядело ужасно. Я не устанавливал никаких предпочтительных размеров (потому что центр gridLayout и borderLayout все равно их проигнорирует). Во всяком случае, я запомнил эту функцию для следующего раза, когда она мне может понадобиться :) - person user4758246; 19.07.2014