Почему GridLayout не позволяет изменять компоненты по строкам и столбцам? - PullRequest
0 голосов
/ 28 января 2020

Возможно, это скорее скулить, чем вопрос, и я знаю, что есть обходной путь, описанный в этом посте . Но у меня есть ситуация, когда я должен добавить компоненты к GridLayout, возможно, увеличивая сетку по мере продвижения; но компоненты не создаются и не вставляются в аккуратном порядке; и я не знаю, когда мне будут вручать компоненты для вставки в сетку. Другими словами, в сетке 3x3 я мог бы получить компонент, чтобы поставить в (0,2), а затем еще один в (1,0) и затем один в (0,0). И тогда я могу получить один в (5,2) и нужно увеличить сетку. И тогда мне, возможно, скажут заменить строку в (0,0) чем-то другим.

Я понимаю, что нет никакого способа сказать «поместить компонент в x, y». Я понял, что мне придется создать 2D-массив для хранения моих компонентов, а затем очищать и повторно заполнять сетку из массива, каждый раз, когда она меняется, что будет довольно часто в нескольких больших сетках, поэтому я бы а не. Я понимаю, что жизнь такая, а язык - это язык, и кто я такой, чтобы спросить, почему.

Но мне действительно любопытно. Похоже, что это самая основная c операций для поддержки сетки. Отсутствие ощущения, будто я работаю с электронной таблицей, которая позволяет вводить значения только по порядку слева направо - это просто безумие.

Я не разобрал исходный код для GridLayout, но любой наивный понимание того, как это «должно работать», заставляет меня думать, что add(component, row, col) должно быть тривиально для реализации. Этого не должно быть, потому что GridLayout не совсем новый, и я не могу поверить, что я первый, кто считает, что произвольный доступ к сетке - хорошая идея. Так что это должно быть очень сложно. Но почему?

Я понимаю, почему внутреннее устройство GridLayout не может это поддержать, не решает никаких реальных проблем, кроме проблемы, связанной с тем, что я не могу перестать думать о том, насколько странно это ограничение. В конце я собираюсь получить параллельный массив или возиться с более сложным GridBagLayout, если кто-то не знает лучшего способа. Но я просто хочу знать, почему я должен.

1 Ответ

2 голосов
/ 28 января 2020

Почему бы не подойти к проблеме под другим углом:

  • Создайте свою сетку, используя GridLayout
  • Заполните сетку пустой JPanels
  • JPanels, каждый из которых использует BorderLayout
  • Держите эти JPanels там, где они есть
  • Но меняйте местами JPanels, которые они отображают внутри них, в каждой из их позиций BorderLayout.CENTER

Кроме того, вы можете использовать их с помощью CardLayout, но эффект будет тот же

...