如何从 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();
我没有看到你在"面板"JPanel 上在哪里调用remove(...)
,所以我不知道你是如何删除 JTextFields 的。一些建议:
- 如果您必须遵循您建议的当前路线,请使用单个专用容器 JPanel,该容器在 GridLayout 中保存 JTextFields,并且不保存其他组件。
- 在添加新组件之前删除所有组件(如果需要这样做)
- 在删除和添加后,在容器 JPanel 上调用
revalidate()
和 'repaint()'。 - 请考虑改用 JTable,您只需添加或删除行即可。在我看来,这将是解决此类问题的最简单,最干净的解决方案。
JTextField[] txtField = new JTextField[val];
此行不会初始化数组,只是创建一个具有 val 计数的数组。默认情况下,这些元素为 null,因此在使用 for-each 循环迭代数组时会引发NullPointerException
。
您需要使用有效的JTextField
对象初始化数组。
为什么不简单地让一个接受所需JTextField
数的方法,并让它返回一个JPanel
,其中包含已添加到具有适当布局的JPanel
的正确数量的所需JTextField
,并且所有:
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;
}
,只需从JFrame
的内容窗格中删除最后一个JPanel
。
或者使用以下方法再次清空JFrame
:getContentPane().removeAll();
并向其中添加新JPanel
和包含用户控件的JPanel
,尽管不必每次都重新创建用户控制面板。