2013-05-12 4 views
0

Привет, ребята и дамы,Создание FormLayout строк и столбцов динамически (во время выполнения)

, как я позволил Затмения WindowBuilder создать мне JPanel с FormLayout, я хотел бы сделать это творение быть динамичным, так как программа I Это написано так, чтобы избежать 1000 строк. Я использовал следующий код:

JPanel pData = new JPanel(); 
pData.setBounds(10, 232, 381, 163); 


FormLayout fLayout= new FormLayout(new ColumnSpec[]{}, new RowSpec[]{}); 

int numCols = 5; 
int numRows = 10; 

for(int i=1;i<=numCols;i+=2) 
{ 
    fLayout.insertColumn(i, FormFactory.RELATED_GAP_COLSPEC); 
    fLayout.insertColumn(i+1, FormFactory.DEFAULT_COLSPEC); 
} 

for(int j=1;j<=numRows;j+=2) 
{ 
    fLayout.insertRow(j, FormFactory.RELATED_GAP_ROWSPEC); 
    fLayout.insertRow(j+1, FormFactory.DEFAULT_ROWSPEC); 
} 

pData.setLayout(fLayout); 
getContentPane().add(pData); 

Но запустить программу, я получаю пачку ошибок, начиная с:

«Индекс столбца 1 должен быть в диапазоне [1, 0]»

Изменение индекса в циклах (-ов) просто изменяет число в середине этого текста ошибки, но остальное остается неизменным.

Что я делаю неправильно? Возможно ли даже создать FormLayout динамически? Я бы очень признателен за вашу помощь!

Дополнительная информация: Причина, по которой я использую FormLayout, состоит в том, что столбцы имеют разные размеры. Я знаю, что GridBagLayout также может это сделать, но для получения одинаковых результатов в отношении вставок и положения требуется больше строк и цифр. Но если это единственная разумная альтернатива, я соглашусь с ней ... пока она динамична ;-)

+1

1) Для лучшей помощи раньше, отправьте сообщение [SSCCE] (http://sscce.org/). 2) 'pData.setBounds (10, 232, 381, 163); Java GUI, возможно, придется работать на нескольких платформах, на разных разрешениях экрана и с использованием разных PLAF. Таким образом, они не способствуют точному размещению компонентов. Для надежного графического интерфейса вместо этого используйте диспетчер компоновки или их комбинации вместе с макетом и границами для пробела, чтобы организовать компоненты. –

+0

Спасибо, Андрей за ваш быстрый ответ! 1) Я буду помнить SSCCE в следующий раз! Это мой первый пост. Я изучаю <:-) 1a) Как я могу сделать это SSCCE? Я думал, что это уже достаточно коротко ... Я не знаю, как сделать это еще проще, не создавая проблемы с большей зарплатой. 2) pData.setBounds (...) был создан WindowBuilder. Я этого не делал. Но ты прав. Я сделаю это гибким. – Stacky

+0

Будет ли это ['GroupLayout'] (http://stackoverflow.com/a/14858272/230513) альтернативой? – trashgod

ответ

2

Это связано с тем, как работает «insertRow()/insertColumn()». Чтобы вставить что-то, у вас уже есть строка/столбцы для вставки между ними. Вместо этого вы должны использовать «.appendRow() /. AppendColumn()», которые просто добавляют новую строку или столбец внизу всех существующих строк или справа от любых существующих столбцов.

EX:

int numCols = 2; 
int numRows = 10; 

for(int i=1;i<=numCols;i++) 
{ 
    fLayout.appendColumn(FormFactory.RELATED_GAP_COLSPEC); 
    fLayout.appendColumn(FormFactory.DEFAULT_COLSPEC); 
} 

for(int j=1;j<=numRows;j++) 
{ 
    fLayout.appendRow(FormFactory.RELATED_GAP_ROWSPEC); 
    fLayout.appendRow(FormFactory.DEFAULT_ROWSPEC);; 
} 
this.setLayout(fLayout); 

Это добавило бы 4 колонки (2 по умолчанию и 2 связанных с пробелами) и 4 ряда (2 по умолчанию и 2 связанных с пробелами) на то, что уже существует.

Смежные вопросы