[英]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,只在滚动、调整大小等时显示最新信息……),最终克服这些问题? 谢谢你。
. 但是,选择不同的文件或更新选定的文件时,然后再次单击“检查语法”按钮,开始发生一些图形问题
不要继续创建新组件。 旧组件仍添加到框架中。 所以现在你有两组组件。
相反,您可以替换:
JTable
中的数据使用table.setModel( yourTableModel )
JScrollPane
中的组件使用scrollPane.setViewportView( yourTable )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.