JFrame: удаление JTextFields через кнопку? - PullRequest
0 голосов
/ 21 февраля 2020

My GUI имеет кнопку, которая позволяет мне поместить новый JTextField в массив, а затем поместить его на мой GUI. Я хотел также создать еще одну кнопку, которая удаляет последний JTextField в массиве. Мой ActionListener для моей кнопки «Удалить» имеет следующий код

   private class Remover implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            remove(listOfTextFields.get(listOfTextFields.size()));
            pack();
            invalidate();
            repaint();
        }
    }

Я ожидал, что он просто удалит последний экземпляр JTextField, который был создан, но я получаю исключение IndexOutofBoundsException с индексом # вне границ длины #. # как бы много JTextFields я не добавил. Я думал, что я был в границах, и это удалит последний JTextField в моем массиве, но я думаю, что мои логики c не верны.

Я попытался записать remove(listOfTextFields.get(listOfTextFields.size()-1));, что позволило мне удалить один ящик, но Я не могу продолжать нажимать кнопку «Удалить», чтобы сделать больше. Чего мне не хватает?

Вот полный код для вашей справки:

public class TheGUI extends JFrame {
    List<JTextField> listOfTextFields = new ArrayList<JTextField>();
    List<String> wordsToChoose = new ArrayList<String>();

    private JTextField instruct;
    private JButton submit;
    private JButton addNew;
    private TheGUI frame;
    private Random r = new Random();
    private JButton remove;

    public TheGUI() { //My GUI with the default fields & buttons that should be on there.
        super("Chili");
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        instruct = new JTextField("Choose your words");
        instruct.setEditable(false);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 0;
        add(instruct, c);

        addNew = new JButton("Add");
        c.weightx = 0.0;
        c.gridx = 1;
        c.gridy = 0;
        add(addNew, c);


        remove = new JButton("Remove");
        c.weightx = 0.0;
        c.gridx= 2;
        c.gridy = 0;
        add(remove, c);

        submit = new JButton("Submit!");
        c.weightx = 0.5;
        c.gridwidth = 3;
        c.gridx = 0;
        c.gridy = GridBagConstraints.PAGE_END;
        add(submit, c);

        addNew.addActionListener(new Adder());
        submit.addActionListener(new Randomizer());
        remove.addActionListener(new Remover());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
        setVisible(true);

    }

    private class Adder implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {

            JTextField textfield = new JTextField();

            listOfTextFields.add(textfield);
            GridBagConstraints textFieldConstraints = new GridBagConstraints();
            textFieldConstraints.fill = GridBagConstraints.HORIZONTAL;
            textFieldConstraints.weightx = 0.5;
            textFieldConstraints.gridx = 0;
            textFieldConstraints.gridwidth = 4;
            textFieldConstraints.gridy = listOfTextFields.size();

            add(textfield, textFieldConstraints);
            pack();
            revalidate();
            repaint();

        }
    }

    private class Remover implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            remove(listOfTextFields.get(listOfTextFields.size()));
            pack();
            invalidate();
            repaint();
        }
    }

1 Ответ

1 голос
/ 21 февраля 2020

Вы забыли удалить JTextField из списка в Remover. При этом он хочет удалять один и тот же элемент каждый раз, когда вы нажимаете снова, но его уже нет в GUI, только в списке.

Исключение IndexOutOfBoundsException связано с тем, что индексирование список начинается с 0. Например, если список содержит одно значение, то .size() возвращает 1. Таким образом, способ использования .size() - 1 уже правильный.

Дополнительные сведения об индексировании вы можете найти здесь .

Попробуйте эту реализацию, она должна работать.

private class Remover implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        remove(listOfTextFields.get(listOfTextFields.size()-1));
        listOfTextFields.remove(listOfTextFields.size()-1)
        pack();
        invalidate();
        repaint();
    }
} 
...