3

我想创建一个 JPanel,我可以在其中添加 Text Fields 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 的选项? (这是最重要的)

我得到这个:面板图片1,并且想要这个:面板图片2

(对不起语言 - 这是第一次)

- - 编辑 - -

万一我们误解了:让我做对了,我正在寻找不同 LM 中的方法/选项,如果没有空间添加 TextField(在本例中为第 7 个),它可以帮助我“滚动”行,应该移动到 TOP 上的下一个(列)。我没有定义 2 列,但是这个 JPanel 的区域让我觉得好像有一个空间可以容纳 2 列 JTextField。当我添加所有 12 个字段并删除例如第二个字段时,它们应该向上移动以覆盖这个空间

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

1 回答 1

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()来确定如何初始化您的布局。

于 2013-03-09T13:19:01.657 回答