如何强制刷新/重绘 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?的主要内容,如果未能解决你的问题,请参考以下文章