Как я могу динамически переставлять элементы в gridlayout с помощью java?

Мне нужно переупорядочить элементы, которые находятся в моем GridLayout, чтобы при динамическом создании JButton нижний колонтитул (то есть JLabel) оставался внизу сетки, а динамически созданная кнопка располагалась прямо над нижним колонтитулом.

Это возможно? Если да, могу ли я увидеть пример, пожалуйста?

Моя сетка в настоящее время

new GridLayout(intIndex, 1);

где intIndex увеличивается каждый раз при создании динамического элемента.


person Dennis Martinez    schedule 14.09.2011    source источник


Ответы (2)


Поскольку это нижний колонтитул, вы, вероятно, захотите использовать BorderLayout и оставить нижний колонтитул внизу с помощью BorderLayout.PAGE_END. Затем поместите компонент с GridLayout в центр с BorderLayout.CENTER. Таким образом, ваш нижний колонтитул всегда будет оставаться внизу и не будет мешать содержимому, которое вы теперь можете изменить, используя любой менеджер компоновки, не затрагивая нижний колонтитул.

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

person Nate W.    schedule 14.09.2011
comment
Спасибо за отзыв, а то я и не подумал об этом! Единственная проблема, с которой я столкнулся, это попытка переупаковать (используя pack() после того, как я добавил элемент в макет). Он будет перепакован только не в новый размер. Любые идеи? - person Dennis Martinez; 14.09.2011
comment
Если вы не добавляете компоненты непосредственно в JFrame или в какой-нибудь тяжеловесный контейнер, вам не нужно вызывать pack(). Какой компонент имеет неправильный размер для вас? Не могли бы вы предоставить немного больше деталей? - person Nate W.; 14.09.2011
comment
Когда я добавляю новую панель в gridlayout в позиции BorderLayout.CENTER, вид JFrame перекрывает предыдущую панель, и я полагал, что пакет просто изменит размер jframe до соответствующего размера. - person Dennis Martinez; 14.09.2011
comment
См. также этот связанный пример. - person trashgod; 15.09.2011
comment
@ Деннис Мартинес: Теперь у тебя другая проблема! К счастью, это распространено — вы сможете найти несколько сообщений, в которых обсуждается динамическое добавление компонентов пользовательского интерфейса — проверьте их и вернитесь с вопросами, если вы не можете заставить его работать! - person Nate W.; 15.09.2011

Я думаю, что могу добавить еще, хотя один ответ принят.

Существует два интерфейса для макетов: LayoutManager и LayoutManager2. Второй расширяет первый. Итак, все классы компоновки наследуются от LayoutManager.

Теперь LayoutManager2 позволяет размещать компоненты в соответствии с некоторыми ограничениями. Например, в ответе Shakedown BorderLayout.CENTER является ограничением для BorderLayout.

Однако макеты, которые реализуются только LayoutManager, не принимают ограничений для конкретного компонента. GridLayout такая раскладка. Он начнет добавлять компоненты из верхнего левого угла и продолжит движение вправо и перейдет к следующей строке, когда одна строка будет заполнена.

Вас может заинтересовать GridBagLayout.

person Mohayemin    schedule 15.09.2011