繁体   English   中英

如何强制重绘 JTable、JScrollPane?

[英]How to force repaint of JTable, JScrollPane?

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

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

第一次

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

修改输入文件后

调整 window 的大小时,问题更加明显:

在此处输入图像描述

这是框架的结构:

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);

                ...

关于如何强制框架或目标组件完全重绘的任何想法(即忘记以前的 state,只在滚动、调整大小等时显示最新信息……),最终克服这些问题? 谢谢你。

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

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

相反,您可以替换:

  1. JTable中的数据使用table.setModel( yourTableModel )
  2. JScrollPane中的组件使用scrollPane.setViewportView( yourTable )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM