[英]Why does the last item added to a panel occupy the whole panel?
我在面板上添加了一定數量的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
大小,並且該文本框不采用該方法指示的邊界,但所有其他文本框仍在其中並正確添加。
panel.setLayout(new BorderLayout());
您正在使用BorderLayout。
panel.add(textBoxes [i]);
使用add()方法時,默認是將組件添加到BorderLayout的CENTER
。 但是,只能將單個組件添加到中心,因此布局管理器將僅管理最后添加的組件的大小/位置。 BorderLayout的規則是使組件占用所有可用空間。
但是,您還對其他文本字段使用了setBounds()
方法,這會引起問題。 您不應嘗試使用布局管理器來自己管理組件的邊界。
解決方案是僅使用布局管理器,然后讓布局管理器完成其工作。 閱讀Swing教程中有關使用布局管理器的部分,以獲取更多信息,並使用更合適的布局管理器。
更新:
它是賓果游戲表
然后,也許您甚至都不應該使用JTextFields。 也許JTable
將是更好使用的組件。 本教程還有關於How to Use Tables
。
您的問題在這里:
panel.setLayout(new BorderLayout());
您將布局設置為BorderLayout,然后將組件添加到JPanel,就好像它是GridLayout。 可以理解,以默認方式將組件添加到使用BorderLayout的容器中時,組件會添加到BorderLayout.CENTER位置中,該位置將填充該位置,從而覆蓋所有添加的內容。
也許您希望改為使用GridLayout? 您將需要閱讀布局管理器教程以獲取更多信息。
這是因為您正在使用BorderLayout和BorderLaout始終需要一個參數,例如BorderLayout.CENTER,BorderLayout.WEST,BorderLayout.EAST,BorderLayout.NORTH和BorderLayout.SOUTH。
因此,基本上BorderLayout僅具有5個可以放置組件的位置。 而且,如果您未指定添加組件的位置,則默認為BorderLayout.CENTER。 而且由於BorderLayout.CENTER位置一次只能有一個組件,因此它實際上僅添加了最后一個。 因此,我建議使用另一個布局管理器,例如GridLayout(如果您希望所有組件的大小均等)。
我希望這有幫助 :)。
PS:如果您希望我對GridLayout進行一些說明,請問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.