JTable в JScrollPane в методе, расширяющем JPanel, не обновляется - PullRequest
0 голосов
/ 05 мая 2020

Я делаю GUI, в котором есть список фильмов, которые вы можете искать, сортировать и фильтровать. В настоящее время все параметры сортировки, параметры фильтрации и поиск работают правильно с данными и успешно обновляют данные и JTable, которые у меня есть для списка фильмов. Я проверил, распечатав названия фильмов на консоли для проверки, а также распечатал значение одной из ячеек в таблице. Хотя таблица обновляется правильно, GUI не отображает новую таблицу при изменении данных. UpdateList вызывается из различных слушателей действий других классов GUI. Это текущий код, который у меня есть для updateList

public void updateList() {
        this.setIgnoreRepaint(false);
        this.removeAll();
        sortFilterData = new ArrayList<ArrayList<String>>(data);
        sortFilterData = search.getSearchResult();
        sortFilterData = sorter.getSortResults();
        sortFilterData = filterYear.getFilteredYears();
        sortFilterData = filterGenre.getFilteredGenres();
        if (sortFilterData.size() == 0) {
            System.out.println("No Results");
        } else {
            movies = new String[sortFilterData.size()][6];
            for (int i = 0; i < sortFilterData.size(); i++) {
                for (int j = 0; j < 6; j++) {
                    movies[i][j] = sortFilterData.get(i).get(j);
                    System.out.print(movies[i][j] + " ");
                }
                System.out.println();
            }
            DefaultTableModel movieList = new DefaultTableModel(movies, columnNames);
            JTable table = new JTable(movieList);
            table.setRowHeight(30);
            table.getColumn("Movie ID").setPreferredWidth(30);
            table.getColumn("Title").setPreferredWidth(490);
            table.getColumn("Year").setPreferredWidth(15);
            table.getColumn("Genres").setPreferredWidth(310);
            table.getColumn("IMDB ID").setPreferredWidth(30);
            table.getColumn("Rating").setPreferredWidth(40);

            JScrollPane list = new JScrollPane(table);
            list.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

            table.setFillsViewportHeight(true);
            list.setViewportView(table);

            JLabel label = new JLabel("Movies", SwingConstants.CENTER);
            this.add(label, BorderLayout.NORTH);
            this.add(list, BorderLayout.CENTER);
            this.revalidate();
            this.repaint();
            this.setIgnoreRepaint(true);
        }
    }

До этого кода я также пробовал использовать глобальные переменные list, table и movieList. Я также попытался создать их изначально в конструкторе. Я пробовал использовать fireDataTableChange (), repaint (), revalidate () в таблице, я пробовал использовать repaint () и revalidate () все для различных компонентов, включая «this», я пробовал invalidate () в таблице, Я попытался использовать JTable без создания DefaultTableModel, я попытался добавить все в отдельную JPanel и добавить эту панель на эту панель, я попробовал setModel вместо создания новой таблицы с новой моделью, и я попытался просто обновить все вместо создания новых таблиц и полос прокрутки. Я добавил setIgnoreRepaint, чтобы подтвердить, что JPanel не перекрашивается ничем, кроме этого метода. Я очень не понимаю, в чем проблема, и хотел бы получить любую помощь.

...