Как бы я динамически удалить компонент свинга из JPanel

1

У меня есть JFrame, содержащий JPanel. 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();
    }
}
Теги:
swing

1 ответ

3
Лучший ответ
  1. нет причин использовать NullLayout, используйте GridLayout с одним столбцом

  2. использовать JPanel в качестве контейнера для JComponents

  3. Добавить JPanel содержит другие JPanels для JScrollPane

  4. не устанавливать для PreferredSize, а также для revalidate() и repaint()

  5. SaveIt acojfar = new SaveIt(); должен быть завернут в invokeLater, больше для чтения в учебнике Oracle Initial Thread

  6. например

  • 0
    На самом деле у меня есть корневая панель, и внутри нее я добавляю JScrollPane, и я помещаю панель panAmount в эту JScrollPane. Но я не указал их в моих кодах выше для простоты
  • 0
    @ user3231725 Почему вы добавляете панель прокрутки в корневую панель?
Показать ещё 15 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню