如何从jpanel中删除组件。在下面的代码中,将根据val创建文本字段。这对于创建来说很好。但是当微调器中的值降低时,文本字段也应该减少。
我试图从数组txtField中删除所有组件但没有工作。
int val = (int) textFieldGen.getModel().getValue(); //getting the value from JSpinner
JTextField[] txtField = new JTextField[val];
//tried panel.revalidate(); panel.repaint();
//removing elements if exists. gives null pointer exception.
try {
for (JTextField txtComp : txtField) {
panel.remove(txtComp);
}
} catch (Exception ex) {
System.out.println(ex);
}
panel.revalidate();
panel.repaint();
//creating
int row = 1;
for (int i = 0; i < txtField.length; i++) {
row++;
layout.appendRow(RowSpec.decode("30px"));
txtField[i] = new JTextField(10);
panel.add(txt[i], cc.xy(4, row));
}
panel.revalidate();
panel.repaint();
答案 0 :(得分:5)
我看不到你在“面板”JPanel上调用remove(...)
的位置,所以我不知道如何删除JTextFields。一些建议:
revalidate()
和'repaint()`。答案 1 :(得分:2)
JTextField[] txtField = new JTextField[val];
这一行不会初始化数组,只需创建一个val计数。默认情况下,这些元素为null,因此在使用for-each循环迭代数组时抛出NullPointerException
。
您需要使用有效的JTextField
个对象初始化数组。
答案 2 :(得分:2)
为什么不简单地让一个方法接受您想要的JTextField
个数量,并让它返回JPanel
,其中JTextField
已经添加到{{1}适当的布局和所有:
JPanel
并从public JPanel createPanel(int numberOfTextFields) {
JPanel panel=new JPanel(new ...);//create new panel
JTextField tfs[]=new JTextField[numberOfTextFields];//create array of textFields
for(int i=0;i<numberOfTextFields;i++) {
tfs[i]=new JTextField();//create the textfield
panel.add(tfs[i]...);//add it to the panel
}
return panel;
}
contentPane 中删除最后一个JPanel
。
或者使用:JFrame
再次清空JFrame
,然后将新的getContentPane().removeAll();
添加到其中,并添加包含用户控件的JPanel
,虽然每次都不需要重新创建用户控件面板。