Java 为什么添加到面板的最后一项会占据整个面板?

Java 为什么添加到面板的最后一项会占据整个面板?,java,swing,Java,Swing,我在一个面板中添加了大量的JTextField,所有这些都添加了,但最后添加的一个占据了整个面板,似乎所有其他文本框都添加到了最后一个。。。。。这是密码 public JPanel crearCartonFormulario() { panel = new JPanel(); panel.setLayout(new BorderLayout()); JTextField[] textBoxes = new JTextField[25]; int cont = 0;

我在一个面板中添加了大量的
JTextField
,所有这些都添加了,但最后添加的一个占据了整个面板,似乎所有其他文本框都添加到了最后一个。。。。。这是密码

public JPanel crearCartonFormulario() {
    panel = new JPanel();
    panel.setLayout(new BorderLayout());
    JTextField[] textBoxes = new JTextField[25];
    int cont = 0;
    int posX = 10;
    int posY = 0;
    llenarArreglo();
    while (cont <= 4) {
        for (int i = 0; i <= 4; i++) {

            if (cont == 2 && i == 2) {
                textBoxes[i] = new JTextField("");
            } else {
                textBoxes[i] = new JTextField(String.valueOf(numeros[cont][i]));
            }
            textBoxes[i].setBounds(i + posX, 15 + posY, 40, 40);
            textBoxes[i].setEditable(false);
            panel.add(textBoxes[i]);
            posX += 50;
        }
        posY += 50;
        posX = 10;
        cont++;
    }
    return panel;
}
public JPanel crearCartonFormulario(){
panel=新的JPanel();
panel.setLayout(新的BorderLayout());
JTextField[]textboxs=新的JTextField[25];
int cont=0;
int posX=10;
int-posY=0;
Llenarrarglo();
而(cont您的问题在于:

panel.setLayout(new BorderLayout());
您将布局设置为BorderLayout,然后将组件添加到JPanel,就像它是GridLayout一样。请理解,当您以默认方式使用容器将组件添加到BorderLayout时,组件将添加到BorderLayout.CENTER位置,该位置将填充此位置,覆盖先前添加的任何内容

也许您想改用GridLayout?您需要阅读layout manager教程了解更多信息。

您的问题在于:

panel.setLayout(new BorderLayout());
您将布局设置为BorderLayout,然后将组件添加到JPanel,就像它是GridLayout一样。请理解,当您以默认方式使用容器将组件添加到BorderLayout时,组件将添加到BorderLayout.CENTER位置,该位置将填充此位置,覆盖先前添加的任何内容

也许您希望改用GridLayout?更多信息,请阅读布局管理器教程

panel.setLayout(新的BorderLayout())

您正在使用边框布局

panel.add(文本框[i])

使用add()时默认方法是将组件添加到BorderLayout的
中心
。但是,只能将单个组件添加到中心,因此布局管理器将只管理最后添加的组件的大小/位置。BorderLayout的规则是使组件占用所有可用空间

但是,您还对其他文本字段使用了
setBounds()
方法,这会导致问题。您不应尝试使用布局管理器并自行管理组件的边界

解决方案是只使用布局管理器,让布局管理器完成它的工作。有关更多信息,请阅读Swing教程中的部分,并使用更合适的布局管理器

更新:

这是一张宾果桌

那么也许你甚至不应该使用JTextFields。也许
JTable
是一个更好的组件。本教程还有一节介绍
如何使用表

panel.setLayout(新的BorderLayout())

您正在使用边框布局

panel.add(文本框[i])

使用add()时默认方法是将组件添加到BorderLayout的
中心
。但是,只能将单个组件添加到中心,因此布局管理器将只管理最后添加的组件的大小/位置。BorderLayout的规则是使组件占用所有可用空间

但是,您还对其他文本字段使用了
setBounds()
方法,这会导致问题。您不应尝试使用布局管理器并自行管理组件的边界

解决方案是只使用布局管理器,让布局管理器完成它的工作。有关更多信息,请阅读Swing教程中的部分,并使用更合适的布局管理器

更新:

这是一张宾果桌


那么也许你甚至不应该使用JTextFields。也许
JTable
是一个更好的组件。本教程还有一节介绍
如何使用表

,这是因为你使用的是BorderLayout和BorderLayout,但总是需要一个参数,如BorderLayout.CENTER、BorderLayout.WEST、BorderLayout.EAST、BorderLayoutLayout.NORTH和BorderLayout.SOUTH

所以基本上BorderLayout只有5个组件可以放置的位置。如果添加组件时不指定位置,则默认为BorderLayout.CENTER。由于BorderLayout.CENTER位置中一次只能有一个组件,因此它实际上只添加最后一个。因此我建议使用其他布局管理器,如GridLayout(如果希望所有组件的大小相同)

我希望这有帮助:)。


另外,如果您想让我解释一下GridLayout,请提问。

这是因为您使用的是BorderLayout和BorderLayout,但始终需要一个参数,如BorderLayout.CENTER、BorderLayout.WEST、BorderLayout.EAST、BorderLayout.NORTH和BorderLayout.SOUTH

所以基本上BorderLayout只有5个组件可以放置的位置。如果添加组件时不指定位置,则默认为BorderLayout.CENTER。由于BorderLayout.CENTER位置中一次只能有一个组件,因此它实际上只添加最后一个。因此我建议使用其他布局管理器,如GridLayout(如果希望所有组件的大小相同)

我希望这有帮助:)。


另外,如果你想让我解释一下GridLayout,那就问问吧。

我明白,但是哪个loyout manager是正确的?我正在尝试用JTextField来制作类似网格的东西。我不知道“类似网格”是什么意思。你看过教程了吗?有两个布局管理员用“网格”这个词以布局管理器的名义。阅读教程并下载示例程序和实验。只有您知道确切的要求。请参阅update.jajjaa><谢谢我用GridLayout管理器解决了这个问题,再次感谢!我希望您也摆脱了挫折()声明。我明白,但是哪个loyout管理器是正确的?我试图用jtextfield来制作类似网格的东西。我不知道“类似网格”是什么意思。你看过教程了吗?有两个布局管理器用“网格”这个词在布局管理器名称中。阅读教程并下载示例程序和实验。只有你知道确切的答案