【问题标题】:removing specific components from jpanel从 jpanel 中删除特定组件
【发布时间】:2012-09-10 05:55:42
【问题描述】:

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

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing jgoodies


【解决方案1】:

我看不到您在“面板”JPanel 上调用remove(...) 的位置,因此我不知道您如何删除 JTextField。一些建议:

  • 如果您必须采用您提议的当前路线,请使用单个专用容器 JPanel,该容器将 JTextField 保存在 GridLayout 中并且不包含其他组件。
  • 在添加新组件之前删除所有组件(如果您需要这样做)
  • 在移除和添加之后,在容器 JPanel 上调用 revalidate() 和 'repaint()`。
  • 考虑改为使用 JTable,您只需添加或删除行。在我看来,这是解决此类问题的最简单、最干净的解决方案。

【讨论】:

  • 我已经更新了这个问题。添加了删除 JTextField 的代码
【解决方案2】:

JTextField[] txtField = new JTextField[val];

这一行不会初始化数组,只是创建一个计数为 val 的数组。默认情况下,元素为 null,因此当您使用 for-each 循环迭代数组时会抛出 NullPointerException

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

【讨论】:

  • 它在代码的最后部分完成,由 //creating 注释的行。从 sn-p 中并不完全清楚,但乐观的我希望在尝试删除任何内容之前调用它们:-)
  • @kleopatra 不,这不能解决这个问题,是吗?当在JPanel 实例上调用remove() 方法时,它期望删除一个非空的Component。在创建JTextField 实例之前调用此方法。
  • 正如我所说的,对我来说,sn-ps 中的序列并不完全清楚。如果它是 real 序列(在实例化之前删除),您确实发现了原因:)。如果只是随机顺序的 sn-ps,那么还有其他问题(我敢打赌,但只是猜测)-@FirmView 请澄清,最好使用 SSCCE
【解决方案3】:

为什么不简单地有一个方法接受你想要的JTextFields 的数量,让它返回一个JPanel,其中需要的正确数量的JTextFields 已经添加到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;
}

然后从JFrames contentPane中删除最后一个JPanel

或者再次清空JFrame,使用:getContentPane().removeAll(); 并添加新的JPanel 和包含用户控件JPanel,尽管用户控件 面板不必每次都重新创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2012-08-03
    • 2010-10-09
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多