java - 我将如何从 JPanel 中动态删除 swing 组件

标签 java swing

我有一个包含 JPanel 的 JFrame。JPanel 包含一个 JComboBox、JTextField、添加按钮和一个删除按钮。如果我单击添加按钮,我需要添加一行包含上述组件(即 JComboBox、JTextField ,添加按钮和删除按钮)并禁用之前的添加按钮。如果我单击新形成的行中的添加按钮,同样需要发生。我已经完成了这些。现在,如果我单击任何删除按钮,我需要从 JPanel 的那一行中删除 Swing 组件,对于其他删除按钮也是如此。该怎么做?请帮助我。 下面是我的代码

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 的 JPanel 添加到 JScrollPane

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

  5. SaveIt acojfar = new SaveIt(); 应该被包装到 invokeLater 中,更多信息请阅读 Oracle tutorial Initial Thread

  6. for example

关于java - 我将如何从 JPanel 中动态删除 swing 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361628/

相关文章:

java - 无法将鼠标监听器添加到包含列表的 JScrollpane

java - 文本字段 tableNum 不会将 String 从另一个类传递到 tableLabel

java - 是否有用于 KeyEvent 的 postActionEvent 版本(专门用于 JTextArea)?

java - Request Param 的可选参数是一种不好的做法吗?

NetBeans 中的 Java Swing Jscrollpane

java - 如何在 win7 64 位上使用 javaFX 在网络摄像头上拍摄图像?

java - 如何在 Spring Boot 中处理 DeferredResult 中的异常?

java - Application.DoEvents() -> Java 中的等效函数?

java - 哪个 Eclipse API 用于执行 "Override/implement Methods"菜单?

Java 继承和避免经常使用 instanceof