Refre sh JPanel для отображения добавленных компонентов в JList - PullRequest
0 голосов
/ 14 марта 2020

Итак, в моем коде у меня есть рамка с панелью меню, которая позволяет мне добавлять панели. Одна панель имеет несколько текстовых полей, через которые я строю объекты, добавляю их в ArrayList и затем отображаю их в JList.

Моя проблема в том, что когда я нажимаю кнопку, которая строит объект, панель не обновляется. чтобы немедленно показать содержимое JList, мне нужно вызвать панель из панели меню, чтобы она заработала.

Так что это часть, где я собираю JList и заполняю его, если существует ArrayList (эта часть находится в конструкторе панели):

        listModel = new DefaultListModel();
        if (!MainInterface.listCat.isEmpty()) {
            for (CategorieArticle c : MainInterface.listCat) {
                listModel.addElement(c.toString());
            }
        }
        list = new JList(listModel);

И это метод кнопки, который создает объекты и добавляет их в ArrayList (эта часть находится в методе ActionListener):

    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        if (o == bEnr) {
            if (tfNoCat.getText().isBlank() || tfNomCat.getText().isBlank()) {
            } else {
                MainInterface.listCat.add(new CategorieArticle(tfNomCat.getText()));
                tfNoCat.setText("");
                tfNomCat.setText("");
                mainPanel.revalidate();
                mainPanel.repaint();
            }
        }
    }

Проблема в том, что .revalidate () и .repaint () не обновляют Panel для нее до go через первый фрагмент кода и заполняют JList .

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 14 марта 2020
list = new JList(listModel);

Приведенный выше код ничего не делает. Вы создаете новый JList, но никогда не добавляете его в фрейм.

Не продолжайте создавать JList. JList создается только один раз и добавляется в область прокрутки, которая добавляется во фрейм при первоначальном создании компонентов для GUI.

Чтобы изменить данные, отображаемые в JList, вам нужно всего лишь обновить ListModel существующего JList. JList будет автоматически перекрашиваться.

mainPanel.revalidate();
mainPanel.repaint();

Также не требуется, поскольку вы никогда не добавляете какие-либо компоненты на панель в ActionListener.

, добавляете их в ArrayList и затем отображаете их в JList.

Это реальная проблема. В ArrayList нет необходимости. Данные уже хранятся в ListModel. Нет необходимости размещать данные в двух местах.

Просто добавьте данные непосредственно в ListModel в вашем ActionListener.

//MainInterface.listCat.add(new CategorieArticle(tfNomCat.getText()));
CategorieArtical c = new CategorieArticle( tfNomCat.getText() );
listModel.addElement( c.toString() );
//MainInterface.listCat.add( c ); // if you really need the ArrayList for some other reason

Вы должны создать "listModel" в качестве переменной экземпляра в ваш класс, чтобы к нему можно было получить доступ в ActionListener.

...