BoxLayout динамически добавляющий компоненты (два столбца)

Я хочу создать JPanel, куда я мог бы добавить текстовые поля min 1 max 12. (Поэтому я решил создать JPanel, в котором достаточно места для размещения 12 текстовых полей в 6 строках и 2 столбцах). Это зависит от того, сколько флажков будет установлено пользователем. Более того, эти текстовые поля должны отображаться сверху вниз с выравниванием по левому краю в этой JPanel. И каждый раз, когда один из этих флажков снимается, указанное текстовое поле удаляется из JPanel, а остальные перемещаются в это пустое место (смещаются вверх, чтобы закрыть его пространство).

Поэтому я создаю текстовое поле, если это необходимо, не создаю все в начале и устанавливаюVisible(false). Я думаю, что это лучшее решение.

Например:

//each JTexyField have the same size

JPanel panel = new JPanel(new LayoutManager()); //in my case BoxLayout
If(checkboxEuro == chcecked) {
   JTextField fieldEuro = new JTextField(); 
   panel.add(fieldEuro);
}
else if(checkbox2 == ...) panel.add(fieldDolar);
...
If(checkboxDolar = = unchecked) panel.remove(fieldDolar);

(И мне все равно, где эта кнопка появилась, главное, чтобы эта кнопка появилась после существующей кнопки в этой панели)

что я получаю

Если внизу в JPanel недостаточно места, LM должен добавить это текстовое поле в следующий столбец, начиная сверху. В этом примере 6x2, если бы я попытался добавить еще одно (7-е) текстовое поле, а в этом столбце не хватило места, оно должно было появиться во втором столбце сверху, но его нет. Когда я использую BoxLayout 7-е текстовое поле появилось половина на JPanel и половина выше.

Что я должен делать? Изменить Layout Manager, или, может быть, есть опция, которая не позволяет выходить за пределы JPanel? (это самое важное)

Я получаю это: panel picture 1и хочу это: Изображение панели 2

(Извините за язык - это первый раз)

---- Редактировать---

В случае, если мы неправильно поняли: Позвольте мне понять это правильно, я ищу метод/опцию в разных LM, которые помогают мне прокручивать строки, если нет места для добавления TextField (7-й в этом примере). ), следует переместить в следующий (столбец) вверху. Я не определил 2 столбца, но область этой JPanel позволила мне подумать, что есть пространство, которое содержит 2 столбца JTextField. Когда я добавляю все 12 полей и удаляю, например, второй, остальные из них должны сместиться вверх, чтобы покрыть это пространство.

1 4            2 5
2 5  remove 1  3 6
3 6            4

person lukashDuki    schedule 09.03.2013    source источник
comment
Чтобы получить помощь быстрее и быстрее, рассмотрите возможность публикации SSCCE.   -  person Reimeus    schedule 09.03.2013
comment
+1 за скриншоты :)   -  person Radu Murzea    schedule 09.03.2013


Ответы (1)


Похоже, вы создаете JPanel после того, как все эти значения флажков известны. В этом случае просто определите, сколько текстовых полей вам нужно добавить, а затем создайте макет. Чтобы упростить ваш код, я рекомендую размещать элементы флажка в массиве. Затем вы можете сделать что-то вроде этого:

JCheckBox[] checkBoxes = new JCeckBox[12];
JTextField[] currencyFields = new JTextField[12];
//Then in your constructor you can initialize the Checkboxes, but not the text fields.
checkBoxes[0] = new JCheckBox("Euros");
checkBoxes[1] = new JCheckBox("Hungarian Forint");
// and so on.

//Compute how many text fields we need:
private int numberOfBoxesChecked() {
   c=0;
   for(JCheckBox cb : checkBoxes ) {
       if(cb.isSelected())
           c++;
   }
   return c;
}

Теперь, когда вы создаете панель, вы можете использовать numberOfBoxesChecked(), чтобы определить, как инициализировать ваш макет.

person Thorn    schedule 09.03.2013
comment
Извините, это моя вина, я не упоминаю, что написал это только для описания проблемы. Ваш ответ очень полезен, но я хочу решить проблему с Layout Manger. - person lukashDuki; 09.03.2013
comment
Вы имеете в виду, что хотите создать свой собственный менеджер компоновки, который достаточно умен, чтобы знать, когда использовать один столбец, а когда два? - person Thorn; 09.03.2013
comment
Прежде всего, я хочу использовать определенные менеджеры макетов, я думал, что есть какой-то метод/вариант (мне неизвестный, я новичок в Swing), который позволяет мне сделать это правильно. Но если их нет, я пытаюсь построить свой LM. - person lukashDuki; 09.03.2013
comment
Если вы новичок в Swing, я бы порекомендовал получить больше опыта использования макета, прежде чем пытаться создать свой собственный менеджер макетов. Когда вы хотите добавить или удалить компонент, вы всегда можете просто заново создать окно или JPanel, поэтому представленное мной решение будет работать нормально и потребует меньше усилий, чем создание собственного макета. - person Thorn; 09.03.2013