如何强制刷新/重绘 JScrollPane?

Posted

技术标签:

【中文标题】如何强制刷新/重绘 JScrollPane?【英文标题】:How to force-refresh/repaint a JScrollPane? 【发布时间】:2014-04-26 02:54:31 【问题描述】:

我在程序开始时根据数据库中的一些内容以编程方式将许多组件(JPanels、JLabels 等)添加到 JScrollPane 中。

似乎这个过程对于 GUI(?)来说太快了,所以 JScrollPane 并不总是正确更新,即即使内部 JPanel 大于可见区域,滚动条也不可见。

调整窗口大小 (JFrame) 解决了这个问题,因为我假设 Java 在调整组件大小时会重新打印组件。

作为测试,我添加了一个调试按钮,我可以在程序启动完成后单击该按钮。我正在尝试强制 JScrollPane 自行“刷新”。

我已经尝试过:

scrollpane.repaint();
scrollpane.validate();
scrollpane.revalidate();

它们似乎都不起作用。但是,如果我更改边框(或与 JScrollPane 相关的任何其他布局),它会正确刷新。

scrollpane.setBorder(new LineBorder(Color.RED));

所以我基本上有两个问题。

    强制滚动窗格“刷新”的命令是什么?显然,当我添加边框时,它正在做某种“重新绘制”的事情。我怎样才能只运行它?

    有没有办法在添加组件时“暂停”打印组件,并在添加所有需要的组件后重新开始打印?就像现在一样,我基本上“看到”了在屏幕上添加的组件(即使它真的很快)。如果我可以添加我想要的所有组件然后告诉程序将其打印到屏幕/JFrame 会更好。

【问题讨论】:

会帮助你Swing : JScrollPane doesn't refresh after changes in the structure of a JTable @Suzon 这有什么帮助?这里没有涉及 JTable,并且 OP 已经提到尝试调用 revalidate (以及其他此类方式,尽管可能不是有效的顺序)。 关于重绘/[重新]验证,请参阅***.com/questions/1097366/…。要让所有组件“立即显示”,只需等到它们全部添加完毕后再添加(或使其可见)父元素。 Suzon:是的,我尝试放置 innerPanel.invalidate() 然后运行 ​​scrollpane.repaint() 但没有运气。任何人都知道当我更改它的边框时 JScrollPane 会发生什么?运行什么内部命令?我假设它运行诸如“.repaint()”之类的东西? 当我更改 JScrollPane 的边框时它正在工作,我假设我可以在滚动本身(仅)上运行一些东西来完成这项工作? 【参考方案1】:

将组件添加到可见面板的基本代码是:

panel.add(...);
panel.add(...);
panel.revalidate();
panel.repaint();

添加一个组件没有任何作用,因为该组件的大小仍然为零,因此没有任何东西可以绘制。当您调用 revalidate() 方法时,布局管理器会被调用,因此组件现在将具有位置/大小。然后 repaint() 将绘制组件。 revalidate() 也会导致滚动条在需要时显示。这当然假设您使用的是布局管理器。

组件被添加到面板中,因此您可以调用面板上的方法,而不是滚动窗格。

【讨论】:

【参考方案2】:

仅在我的情况下

frame.pack();

当封闭的 JPanel 被动态调整大小时,有助于获得 JScrollPane 上的滚动条。

【讨论】:

pack() 是针对 AWT 的,这个问题是关于 Swing 的。

以上是关于如何强制刷新/重绘 JScrollPane?的主要内容,如果未能解决你的问题,请参考以下文章

你如何强制刷新 wx.Panel?

F5刷新与Ctrl+F5强制刷新的区别

如何强制 jQuery UI 对话框再次重绘或触发某些东西来强制调整大小

如何在 NSScrollView 中强制重绘内容

Android怎么强制刷新View

如何强制重绘列表视图?