从JPanel中移除特定组件

3

如何从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();

3
为了更快地获得更好的帮助,请发布一个SSCCE - Andrew Thompson
3个回答

5

我没有看到您在"panel" JPanel上调用remove(...)的位置,因此我不知道您如何删除JTextFields。一些建议:

  • 如果你必须按照你目前提出的路线进行,请使用一个单独的容器JPanel,在GridLayout中保存JTextFields并且没有其他组件。
  • 在添加新组件之前先删除所有组件(如果这是您需要做的)
  • 在删除和添加后同时在容器JPanel上调用revalidate()和'repaint()`。
  • 考虑改为使用JTable,只需添加或删除行即可。在我的看法中,这将是解决这个问题最简单、最清洁的方案。

我已经更新了问题。添加了用于删除JTextField的代码。 - FirmView

2

为什么不直接编写一个方法,接受所需的JTextField数量,并返回一个已经添加了正确数量JTextFieldJPanel,包括适当的布局:

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;
}

只需从 JFramecontentPane 中删除最后一个 JPanel

或者使用以下方法再次清空 JFrame: getContentPane().removeAll(); 并将新的 JPanel 以及包含 用户控件JPanel 添加到其中,尽管每次不必重新创建 用户控件 面板。


2

JTextField[] txtField = new JTextField[val];

这行代码并没有初始化数组,只是创建了一个长度为val的数组。由于元素默认为空,因此当您使用for-each循环遍历数组时会抛出NullPointerException异常。

您需要使用有效的JTextField对象来初始化数组。


它在代码的最后部分完成,由//creating注释的行创建。从片段中并不完全清楚,但我很乐观地希望在尝试删除任何内容之前调用它们 :-) - kleopatra
@kleopatra,这并不能解决这个问题,对吧?当在JPanel实例上调用remove()方法时,它期望移除一个非空的Component。而这个方法是在JTextField实例被创建之前就被调用了。 - asgs
2
就像我说的那样,从这些片段中,我并不完全清楚序列。如果它是_真正的_序列(在实例化之前删除),那么你确实发现了原因 :)。如果它只是随机顺序的片段,则还有其他错误(我打赌,但只是猜测)-@FirmView请澄清,最好附上SSCCE。 - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接