将JTextField添加到JPanel并显示它们

7

我正在使用NetBeans、Java和Swing构建一个小应用程序。在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();

但是什么也没有发生:当我运行应用程序时,JFrame中显示了JPanel,但JTextFields没有显示。

我完全不懂如何编写图形Java应用程序,所以我肯定错过了一些非常简单的东西,但我无法看到它。

6个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5
在Netbeans GUI中,将布局管理器设置为GridLayout或FlowLayout(仅供测试使用)。您可以通过转到GUI编辑器,单击面板,然后右键单击并选择布局来实现此操作。 一旦更改了不同的布局,请转到属性并修改布局属性。对于GridLayout,您要确保有3个网格单元格。 尝试myPanel.revalidate()而不是myPanel.validate()。 更加规范的方法是创建一个自定义JPanel(不使用GUI编辑器),它设置自己的布局管理器,填充组件等。然后,在Netbeans GUI编辑器中,将该自定义JPanel拖放到GUI编辑器中。Matisse肯定能够处理Swing组件的运行时修改,但这不是正常使用它的方式。

我放弃使用NetBeans生成的所有类,我编写了自己定制的JPanels,现在一切都像我想象的那样工作。 感谢您指引我正确的方向 :) - Davide Gualano

2

我已经有一段时间没做Swing了,但我认为你需要调用pack()方法来告诉框架重新布局其组件。

编辑:是的,我知道已经很久没有做Swing了。我编写了以下代码,它按预期工作并添加了文本字段...

    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();

验证将执行与打包相同的操作。 - Paul Tomblin
1
验证函数会执行该操作(但不进行调整大小)。 - Tom Hawtin - tackline

0

你的 while 循环有问题。i 从未被递增,因此你的窗口创建陷入无限循环,你的 CPU 利用率应该达到 100%,直到你终止程序。此外,在运行程序时 GUI 应该完全无响应。


在实际代码中,循环是正确的,我正在编辑问题以避免混淆 :) - Davide Gualano

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

0
不要在使用新组件(动态添加的)时使用GroupLayout。它不会显示出来。

-3

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,