BoxLayout 添加组件(动态,两列)

3
我希望创建一个JPanel,可以添加文本字段最少1个最多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应该从顶部开始在下一列中添加此文本字段。在这个例子中,如果我试图添加另一个(第7个)文本字段,并且在这列中没有足够的空间,它应该出现在顶部的第二列中,但实际上并没有。当我使用BoxLayout时,第7个文本字段只出现在JPanel上半部分。

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

我得到了这个图片:panel picture 1,而想要的是这个:panel picture 2

----编辑---

如果我们误解了:让我弄清楚,我正在寻找在不同的LM中帮助我“滚动”行的方法/选项,如果没有空间添加TextField(例如,在此示例中为第7个),则应将其移动到上一个(列)顶部。我没有定义2列,但此JPanel的区域让我想象有一个空间,可容纳2列JTextField。当我添加所有12个字段并删除第二个字段时,其余的字段应向上移动以覆盖此空间。

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

2
为了更好的帮助和更快的解决问题,请考虑发布一个SSCCE - Reimeus
2
https://dev59.com/IOo6XIcBkEYKwwoYSCc1 - StanislavL
+1 for screenshots :) - Radu Murzea
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()来确定如何初始化您的布局。

对不起,是我的错,我没有提到我只是为了描述问题而写这篇文章。你的回答非常有帮助,但我想解决布局管理器的问题。 - lukashDuki
你的意思是你想要构建一个自己的布局管理器,它足够智能,知道何时使用一列或两列? - Thorn
首先,我想使用已定义的布局管理器,我认为有一些方法/选项(对我来说未知,我是Swing的初学者)可以让我做到这一点。但如果不存在,我会尝试构建自己的LM。 - lukashDuki
如果您是初学Swing,我建议在尝试构建自己的布局管理器之前先获取更多使用布局的经验。当您想要添加或删除组件时,您可以随时重新创建窗口或JPanel,因此我提出的解决方案将运作良好,并且比创建自己的布局涉及更少的工作量。 - Thorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接