Как принудительно перерисовать JTable, JScrollPane?

#java #swing #jframe #jtable #jscrollpane

#java #качать #jframe #jtable #jscrollpane

Вопрос:

Я создаю синтаксический анализатор сверху вниз, который проверяет синтаксис данного исходного кода в соответствии с заданной грамматикой, а затем отображает результат в простом графическом интерфейсе.

По сути, пользователь выбирает грамматику и исходные файлы, нажимает «Проверить синтаксис», и результат отображается, как на картинке…

Первый раз

И это изначально работает нормально. Однако при выборе разных файлов или обновлении выбранного файла, а затем повторном нажатии кнопки «Проверить синтаксис» после таких взаимодействий, как прокрутка, изменение размера или щелчок по строкам, начинают возникать некоторые графические проблемы:

После изменения входных файлов

Проблемы становятся более очевидными при изменении размера окна:

введите описание изображения здесь

Вот структура фрейма:

 JFrame frame
  JPanel headerPanel
    ...
  JPanel bodyPanel
    JLabel tableTitle
    JScrollPane tableScrollPane
      JTable table
    JLabel tableSummary
 

Я пробовал такие методы, как revalidate() и repaint() на компонентах, где возникают проблемы, но они исправляли только те, которые связаны с labels …

Я также пытался использовать a SwingWorker , но это не решило проблему.

Вот часть кода, которая может иметь отношение к делу:

                 ...

                var tableScrollPane = new JScrollPane(table);
                tableScrollPane.setBorder(new MatteBorder(0,1,0,1, palette.get("strongTeal")));
                tableScrollPane.setBackground(palette.get("strongTeal"));
                tableScrollPane.revalidate();
                tableScrollPane.repaint();

                ...

                var bodyPanel = new JPanel();
                bodyPanel.setLayout(new BorderLayout());
                bodyPanel.add(tableTitle, BorderLayout.NORTH);
                bodyPanel.add(tableScrollPane, BorderLayout.CENTER);
                bodyPanel.add(tableSummary, BorderLayout.SOUTH);
                bodyPanel.setBorder(new EmptyBorder(45,45,45,45));
                bodyPanel.revalidate();
                bodyPanel.repaint();

                frame.add(bodyPanel, BorderLayout.CENTER);
                frame.setVisible(true);

                ...
 

Есть идеи о том, как заставить фрейм или целевые компоненты полностью перерисовать (то есть забыть о предыдущем состоянии и показывать только самую свежую информацию при прокрутке, изменении размера и т. Д.), В конечном Итоге преодолевая эти проблемы? Спасибо.

Ответ №1:

. Однако при выборе разных файлов или обновлении выбранного файла, а затем повторном нажатии кнопки «Проверить синтаксис» начинают возникать некоторые графические проблемы

Не продолжайте создавать новые компоненты. Старые компоненты по-прежнему добавляются в фрейм. Итак, теперь у вас есть два набора компонентов.

Вместо этого вы можете заменить:

  1. данные в с JTable помощью table.setModel( yourTableModel )
  2. компонент в с JScrollPane помощью scrollPane.setViewportView( yourTable )