Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JTextField添加到JPanel并显示它们_Java_Swing_Jpanel_Jtextfield - Fatal编程技术网

Java 将JTextField添加到JPanel并显示它们

Java 将JTextField添加到JPanel并显示它们,java,swing,jpanel,jtextfield,Java,Swing,Jpanel,Jtextfield,我正在使用Java和Swing在NetBeans中构建一个小应用程序。使用NetBeans设计窗口,我创建了一个内部带有JPanel的JFrame 现在我想动态地向JPanel添加一些jTextFields。 我写了这样的东西: Vector textFieldsVector = new Vector(); JTextField tf; int i = 0; while (i < 3) { tf = new JTextField(); textFieldVector.add

我正在使用Java和Swing在NetBeans中构建一个小应用程序。使用NetBeans设计窗口,我创建了一个内部带有JPanel的JFrame

现在我想动态地向JPanel添加一些jTextFields。 我写了这样的东西:

Vector textFieldsVector = new Vector();
JTextField tf;
int i = 0;
while (i < 3) {
    tf = new JTextField();
    textFieldVector.add(tf);
    myPanel.add(tf); //myPanel is the JPanel where I want to put the JTextFields
    i++;
}
myPanel.validate();
myPanel.repaint();
Vector textFieldsVector=new Vector();
JTextField;
int i=0;
而(i<3){
tf=新的JTextField();
textFieldVector.add(tf);
myPanel.add(tf);//myPanel是我想要放置JTextFields的JPanel
i++;
}
myPanel.validate();
myPanel.repaint();
但什么也没发生:当我运行应用程序时,JFrame显示,里面有JPanel,但JTextFields没有


我在编写图形化Java应用程序方面完全是新手,所以我肯定错过了一些非常简单的东西,但我看不出有什么。

你的while循环是错误的<代码>i永远不会递增,因此窗口创建处于无止境的循环中,在中止程序之前,CPU消耗应为100%。此外,当您运行程序时,GUI应该是完全无响应的。

我已经有一段时间没有做过Swing了,但我认为您需要调用pack()来告诉框架重新部署其组件

编辑:是的,我知道我已经很久没有荡秋千了。我已经完成了下面的代码,它可以像预期的那样工作,并且添加了文本字段

    JFrame frame = new JFrame("My Frame");
    frame.setSize(640, 480);
    JPanel panel = new JPanel();
    panel.add(new JLabel("Hello"));
    frame.add(panel);
    frame.setLayout(new GridLayout());
    frame.pack();
    frame.setVisible(true);
    Vector textFieldVector = new Vector();
    JTextField tf;
    int i = 0;
    while (i < 3) {
        tf = new JTextField();
        textFieldVector.add(tf);
        panel.add(tf); //myPanel is the JPanel where I want to put the JTextFields
        i++;
    }
    panel.validate();
    panel.repaint();
JFrame=newjframe(“我的框架”);
帧设置大小(640480);
JPanel面板=新的JPanel();
panel.add(新的JLabel(“Hello”));
框架。添加(面板);
frame.setLayout(新的GridLayout());
frame.pack();
frame.setVisible(true);
向量textFieldVector=新向量();
JTextField;
int i=0;
而(i<3){
tf=新的JTextField();
textFieldVector.add(tf);
panel.add(tf);//myPanel是我要放置JTextFields的JPanel
i++;
}
panel.validate();
panel.repaint();

使用
GroupLayout
的常用方法是将组件添加到
组中
GroupLayout
保留对其负责的
容器的引用(这很有意义)。您不应该在没有约束的情况下将组件添加到面板中。

在Netbeans GUI中,将布局管理器设置为GridLayout或FlowLayout(仅用于测试)。您可以通过转到GUI编辑器,单击面板,然后右键单击并选择布局来完成此操作

更改为其他布局后,请转到属性并更改布局属性。对于GridLayout,需要确保有3个网格单元

请尝试myPanel.revalidate()而不是myPanel.validate()


更规范的方法是创建一个自定义JPanel(不使用GUI编辑器),它可以设置自己的布局管理器,用组件填充自己,等等。然后,在Netbeans GUI编辑器中,将该自定义JPanel拖放到GUI编辑器中。Matisse当然能够处理Swing组件的运行时修改,但这不是正常的使用方式。

只需使用JTextField的
.setVisible()
方法即可:

JTextField tf = new JTextField() ;
tf.setVisible(true) ;
panel.add(tf) ;

不要将GroupLayout与新的(动态添加的)组件一起使用。它不会显示。

在实际代码中,循环是正确的,我正在编辑问题以避免混淆:)验证将与pack执行相同的操作。验证将执行此操作(但不调整大小)。我放弃了从NetBeans生成的所有类,并编写了自己的自定义JPanel,现在一切都按照我的意思运行。谢谢你为我指明了正确的方向:)