繁体   English   中英

如何从JPanel动态删除swing组件

[英]How would I dynamically remove swing component from JPanel

我有一个包含JPanel的JFrame.JPanel包含一个JComboBox,JTextField,添加按钮和一个删除按钮。如果我单击添加按钮,我需要添加一行包含上述组件(即JComboBox,JTextField,添加按钮)和删除按钮)并禁用以前的添加按钮。如果我点击新形成的行中的添加按钮同样需要发生。我已经完成了这些。现在,如果我点击任何删除按钮,我需要删除摆动JPanel中该行的组件以及其他删除按钮的组件。如何做到这一点?请帮助我。 以下是我的代码

public class SaveIt extends JFrame {

    JPanel panel;
    JButton btnAdd;
    JButton btnRemove;
    JTextField txtAmount;
    JComboBox cmbAmount;
    private int f = 0;
    private int h = 0;

    public SaveIt() {
        super("Add component on JFrame at runtime");
        setLayout(new BorderLayout());
        panAmount = new JPanel();
        panAmount.setLayout(new FlowLayout());
        add(panAmount, BorderLayout.CENTER);
        cmbAmount = new JComboBox();
        add(cmbAmount, BorderLayout);
        txtAmount = new JTextField();
        add(txtAmount, BorderLayout);
        btnAdd = new JButton("Add");
        add(btnAdd, BorderLayout.SOUTH);
        btnAdd.addActionListener(this);
        btnRemove = new JButton("Remove");
        add(btnRemove, BorderLayout.SOUTH);
        btnRemove.addActionListener(this);
        cps = new ArrayList<JComponent>();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent evt) {
        getPanComponents();
    }

    public void getPanComponents() {
        btnAdd.setEnabled(false);
        btnRemove.setVisible(true);

        cmbAmount = new JComboBox();
        cmbAmount.setBounds(80, 50 + f, 115, 28);
        txtAmount = new JTextField();
        txtAmount.setBounds(310, 50 + f, 135, 28);

        btnAdd = new JButton("Add");
        btnAdd.setBounds(463, 50 + f, 41, 29);
        btnRemove = new JButton("Remove");
        btnRemove.setBounds(510, 50 + f, 41, 29);
        btnAdd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {

                getPanComponents();
            }
        });
        btnRemove.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
            }
        });
        cps.add(cmbAmount);
        cps.add(txtAmount);
        cps.add(btnAdd);
        cps.add(btnRemove);
        for (JComponent widget : cps) {
        panAmount.add(widget);
        }
        panAmount.revalidate();
        h = h + 40;
        panAmount.repaint();
        panAmount.setPreferredSize(new Dimension(611, 89 + h));
        f = f + 35;
    }

    public static void main(String[] args) {
        SaveIt acojfar = new SaveIt();
    }
}
  1. 没有理由使用NullLayout ,使用GridLayout和一列

  2. 使用JPanel作为JComponents的容器

  3. 添加JPanel包含另一个JPanels到JScrollPane

  4. 不要为PreferredSize设置,也不要为revalidate()和repaint()设置

  5. SaveIt acojfar = new SaveIt(); 应该包装到invokeLater中,更多内容在Oracle教程初始线程中阅读

  6. 例如

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM