【问题标题】:How to force-refresh/repaint a JScrollPane?如何强制刷新/重绘 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));

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

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

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

【问题讨论】:

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

标签: java swing jpanel jscrollpane


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    仅在我的情况下

    frame.pack();
    

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

    【讨论】:

    • pack() 是针对 AWT 的,这个问题是关于 Swing 的。
    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2012-08-05
    • 2011-12-31
    • 2012-02-09
    • 2020-04-19
    相关资源
    最近更新 更多