我一直在为我当前正在开发的桌面应用程序创建一个对话窗口。对话框必须具有预定数量的文本字段(换句话说,变量),但是在对代码的初始化部分进行编码时遇到了一个奇怪的错误:当JTextField组件被初始化时,最后一个决定占用全部窗口。我尝试了许多奇怪的方法来更改将其添加到窗口的方式,但是无论如何它都会继续执行此操作(我将默认文本设置为字段的索引,以便我知道它始终是最后一个)。这是代码:
package com.main;
import java.awt.EventQueue;
import java.awt.TextField;
import javax.swing.JFrame;
public class classAddingDialog extends startingMenuWindow {
private JFrame frame1;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
classAddingDialog window = new classAddingDialog();
window.frame1.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public classAddingDialog() {
initialize();
}
private void initialize() {
frame1 = new JFrame();
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int count = 18,i; //startingMenuWindow.countForNewClass;
frame1.setBounds(100, 100, 450, 20+50*count/2+50);
TextField[] nameInputs=new TextField[count];
for(i=0;i<count;i++) {
nameInputs[i]=new TextField();
if(i<Math.ceil((double) count/2)) {
nameInputs[i].setBounds(10, 10+50*i, 100, 30);
}else {
nameInputs[i].setBounds(180, (int) (10+50*(i-Math.ceil((double) count/2))), 100, 30);
}
nameInputs[i].setText(Integer.toString(i));
frame1.add(nameInputs[i]);
}
}
}
也不要花费精力检查最后一个JTextField的位置和界限,我已经做了,并且
nameInputs[i].getBounds();
函数返回正确的位置(应该在正确的位置),但实际上它只覆盖整个Window。
如果有人知道问题出在哪里,请告诉我。预先感谢。
答案 0 :(得分:1)
初始化JTextField组件时,最后一个决定占据整个窗口。
Swing使用布局管理器。 JFrame内容窗格的默认布局管理器是BorderLayout。当您不指定约束时,组件将添加到框架的BorderLayout.CENTER。只能将一个组件添加到CENTER,这是您添加的最后一个组件。然后,BorderLayout的规则说明CENTER中的组件将占用框架中所有剩余的空间。
请阅读Layout Manager上Swing教程中的部分,以获取更多信息和使用BorderLayout的示例。
解决方案是不要尝试设置组件的边界,而要使用布局管理器。
JTextField
new JTextField(10)
的名称。 10将指定一次可在文本字段中显示的“ W”字符数。这样,文本字段就可以计算其首选大小,然后布局管理器可以使用它。GridLayout
的面板。有关示例,请参见教程。所以您的基本逻辑将类似于:
JPanel grid = new JPanel( new GridLayout(0, 2) );
for(i = 0; i < count; i++)
{
JTextField textField = new JTextField(10);
textField.setText( Integer.toString(i) );
nameInputs[i] = textField();
grid.add( textField ):
}
frame.add(grid);
frame.pack();
frame.setVisible( true );