【问题标题】:Removing JTextFields after dynamically adding it动态添加后删除 JTextFields
【发布时间】:2014-03-12 10:30:25
【问题描述】:

我的目标是通过单击一个 JLabel 同时删除两个 JTextField。

我已经创建了这样的文本字段:

public void mouseClicked(MouseEvent e) {


            inc++;
            txtName= new JTextField();
            txtNumber = new JTextField();
            txtName.setName("txtName"+inc);
            txtNumber.setName("txtNumber" + inc);

            pnlPanel.add(txtName);
            pnlPanel.add(txtNumber);

            if(count>0){
                x+=50;
                y+=50;

                txtName.setBounds(225,6+y, 182, 27);
                txtNumber.setBounds(35, 6+y, 182, 27);
                txtName.setName(tempBox+count);
                if(pnlTxtText.getComponentCount() >9){

                    pnlPanel.setPreferredSize(new Dimension(450+y,50+y));
                    pnlPanel.add(txtStudName);
                    pnlPanel.add(txtStudentNumber);

                    frmFrame.repaint();
                    scrpPanel.revalidate();
                }
            }
            frmFrame.repaint();
        }

    });

这是我删除文本字段的代码:

public void mouseClicked(MouseEvent e) {
    int countPlace= pnlPanel.getComponentCount();
    int countOfRemaining =countPlace;
    pnlPanel.remove(--countOfRemaining);
    frmFrame.revalidate();
    pnlPanel.remove(--countOfRemaining);
    frmFrame.revalidate();
}

});

不是删除同一行上的txtfields,而是一一删除,我不希望这样。请帮我。谢谢。

【问题讨论】:

    标签: java swing jlabel jtextfield


    【解决方案1】:

    repaint()之前致电pnlPanel.revalidate()

    并且不要使用 setBounds()。改为定义 porper LayoutManager

    【讨论】:

    • ;嗨。我添加了重新验证。我不明白为什么这段代码: int countPlace= pnlTxtTxt.getComponentCount(); int countOfRemaining =countPlace; pnlTxtTxt.remove(countOfRemaining); frmGM.revalidate(); frmGM.repaint(); pnlTxtTxt.remove(countOfRemaining-1);抛出此异常:线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:数组索引超出范围:8 frmGM.revalidate(); frmGM.repaint()
    【解决方案2】:

    取而代之的是,

    public void mouseClicked(MouseEvent e) {
            int countPlace= pnlPanel.getComponentCount();
            int countOfRemaining =countPlace;
            pnlPanel.remove(countOfRemaining-1);
            frmFrame.repaint();
            pnlPanel.remove(countOfRemaining-1);
            frmFrame.repaint();
        }
    });
    

    使用这个

    public void mouseClicked(MouseEvent e) {
            int countPlace= pnlPanel.getComponentCount();
            int countOfRemaining =countPlace;
            pnlPanel.remove(--countOfRemaining);
            frmFrame.revalidate();
            pnlPanel.remove(--countOfRemaining);
            frmFrame.revalidate();
        }
    });
    

    上面的抛出一个 ArrayIndeOutOfBounds 异常,因为在删除组件后 count 剩余变量没有减少。因此,当您第二次尝试删除时,索引会超出范围。

    【讨论】:

    • 您好,谢谢。它删除了 2 个文本字段,但它不会删除我想要删除它们的文本字段。这是为什么呢?
    • 此代码只会删除最后添加到面板的文本字段。您能正确解释一下您希望如何删除文本字段吗?您的面板布局设置为哪种类型?是默认的 FlowLayout 吗?
    • 我发布了图片。你的代码是对的,我只是不明白为什么它没有删除最后两行。请看我的图片。谢谢!
    • 这里的布局是绝对布局。
    【解决方案3】:

    我建议您以<Integer, JPanel> 的形式将所有JPanels 添加到一个Map(我使用HashMap)中。按顺序命名它们,然后只需执行Map.remove(Map.size() - 1)Map.remove(Map.size() - 2)

    您还可以通过Map.keySet() 获取当前的整数集(键);

    Map<Integer, JPanel> temp = new HashMap<Integer, JPanel>();
    temp.put(0, new JPanel());
    temp.put(1, new JPanel());
    temp.put(2, new JPanel());
    temp.remove(temp.size() - 1);
    

    使维护多组面板变得更加容易。在我的应用程序中,我不是用数字来控制它们,而是用短名称来控制它们。

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多