BoxLayout添加动态组件(两个cols)

时间:2013-03-09 12:25:10

标签: java swing layout-manager boxlayout

我想创建一个JPanel,我可以在其中添加文本字段 min 1 max 12 。 (所以我决定创建JPanel,它有足够的空间来包含6行和2列中的12个文本字段)。这取决于用户将检查多少个复选框。更多这些文本字段应该在此JPanel中以从左边缘对齐从上到下出现。每次取消选中其中一个复选框时,指定的文本字段将从JPanel中删除,其余部分移动到此空白区域(向上移动以覆盖其空间)。

所以我在必要时创建文本字段,而不是在开头创建所有文本字段并设置setVisible(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上显示一半,在上面显示一半。

我该怎么办?更改布局管理器,或者可能有不允许跨越JPanel边界的选项? (这是最重要的)

我得到了这个:panel picture 1,想要这个:panel picture 2

(抱歉语言 - 这是第一次)

----编辑---

如果我们误解了:让我说得对,我正在寻找不同LM中的methot / option,如果没有空间添加TextField,可以帮助我“滚动”行(7) - 在这个例子中),应该移到TOP上的下一个(列)。我没有定义2列,但是这个JPanel的区域让我觉得有一个空间可以容纳2列JTextField。当我添加所有12个字段并删除时,例如第二个其余部分应该向上移动以覆盖此空间

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

1 个答案:

答案 0 :(得分:0)

在知道所有这些复选框值之后,您似乎正在构建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()来确定如何初始化布局。