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

时间:2014-06-12 18:15:42

标签: java swing

我正在向面板添加一定数量的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;
}

这是在一个面板上返回的,我保留了这个面板的多个面板,它可以工作,但在这一个面板中,最后JTextField占用了整个面板空间....

包含方法创建的面板的新JFrame采用最后JTextField大小,并且该文本框不采用方法指示的边界,但所有其他文本框仍然在里面并正确添加。

3 个答案:

答案 0 :(得分:3)

  

panel.setLayout(new BorderLayout());

您正在使用BorderLayout。

  

panel.add(文本框[I]);

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

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

解决方案是使用布局管理器并让布局管理器完成其工作。阅读Using Layout Managers上的Swing教程中的部分以获取更多信息,并使用更合适的布局管理器。

更新

  

它是宾果游戏桌

那么也许你甚至不应该使用JTextFields。也许JTable可能是更好的组件。本教程还有一个关于How to Use Tables的部分。

答案 1 :(得分:1)

你的问题在这里:

panel.setLayout(new BorderLayout());

您将布局设置为BorderLayout,然后将组件添加到JPanel,就像它是GridLayout一样。了解当您以默认方式向BorderLayout使用容器添加组件时,组件将添加到BorderLayout.CENTER位置,该位置填充此位置,涵盖任何添加的内容。

也许您希望使用GridLayout代替?您将需要阅读布局管理器教程以获取更多信息。

答案 2 :(得分:0)

这是因为您正在使用BorderLayout和BorderLaout始终需要一个参数,如BorderLayout.CENTER,BorderLayout.WEST,BorderLayout.EAST,BorderLayout.NORTH和BorderLayout.SOUTH。

所以基本上BorderLayout只有一个组件可以去的5个位置。如果您没有指定添加组件的位置,则默认为BorderLayout.CENTER。而且由于BorderLayout.CENTER位置一次只能有一个组件,它只会真正添加最后一个组件。所以我建议像GridLayout这样的其他布局管理器(如果你希望所有组件的大小相同)。

我希望这会有所帮助:)。

附:如果你想让我对GridLayout进行一些探索,请问。