将JTextField添加到JPanel并显示它们

时间:2009-02-13 14:34:17

标签: java swing jpanel jtextfield

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

现在我想动态地将一些jTextField添加到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应用程序的新手,所以我肯定错过了一些非常简单的东西,但我看不清楚。

6 个答案:

答案 0 :(得分:6)

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

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

取代myPanel.validate(),尝试myPanel.revalidate()。

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

答案 1 :(得分: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();

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:-3)

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

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