从 jPanel 中删除特定组件



如何从 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

或者使用以下方法再次清空JFramegetContentPane().removeAll();并向其中添加新JPanel和包含用户控件JPanel,尽管不必每次都重新创建用户控制面板

相关内容

  • 没有找到相关文章

最新更新