我正在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应用程序的新手,所以我肯定错过了一些非常简单的东西,但我看不清楚。
答案 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
的常用方法是将组件添加到Group
。 GroupLayout
保留对其负责的Container
的引用(这是有道理的)。您不应该在没有约束的情况下将组件添加到面板中。
答案 4 :(得分:0)
不要将GroupLayout与新的(动态添加的)组件一起使用。它不会出现。
答案 5 :(得分:-3)
只需使用JTextField的.setVisible()
方法:
JTextField tf = new JTextField() ;
tf.setVisible(true) ;
panel.add(tf) ;