7

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

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

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 应用程序的新手,所以我肯定遗漏了一些非常简单的东西,但我看不出是什么。

4

6 回答 6

5

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

更改为不同的布局后,转到属性并更改布局属性。对于 GridLayout,您要确保有 3 个网格单元。

尝试使用 myPanel.revalidate(),而不是 myPanel.validate()。

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

于 2009-02-13T15:01:31.487 回答
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();
于 2009-02-13T14:52:38.717 回答
0

你的 while 循环是错误的。i永远不会增加,因此您的窗口创建处于无限循环中,并且您的 CPU 消耗应该是 100%,直到您中止程序。此外,当您运行程序时,GUI 应该完全没有响应。

于 2009-02-13T14:47:20.477 回答
0

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

于 2009-02-13T14:53:25.827 回答
0

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

于 2012-01-27T20:05:57.773 回答
-3

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

JTextField tf = new JTextField() ;
tf.setVisible(true) ;
panel.add(tf) ;
于 2010-06-12T04:09:19.597 回答