如何强制重绘 JTable、JScrollPane?

时间:2021-03-31 20:21:01

标签: java swing jframe jtable jscrollpane

我正在创建一个自顶向下的解析器,它根据给定的语法检查给定源代码的语法,然后在一个简单的 GUI 中显示结果。

基本上,用户选择语法和源文件,点击“检查语法”,结果如图所示...

First time

它最初工作正常。但是,在选择不同的文件或更新所选文件时,然后再次单击“检查语法”按钮,在滚动,调整大小或单击行之外的交互之后开始发生一些图形问题:

After modifying input files

调整窗口大小时问题更加明显:

enter image description here

这是框架的结构:

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

我在发生问题的组件上尝试了 revalidate()repaint() 等方法,但它们只修复了标签的问题...

我也尝试过使用 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 个答案:

答案 0 :(得分:2)

<块引用>

。但是,在选择不同的文件或更新所选文件时,然后再次单击“检查语法”按钮,一些图形问题开始发生

不要一直创建新组件。旧组件仍会添加到框架中。所以现在你有两组组件。

相反,您可以替换:

  1. 使用 JTable 获取 table.setModel( yourTableModel ) 中的数据
  2. JScrollPane 中的组件使用 scrollPane.setViewportView( yourTable )
相关问题