如何强制刷新/重绘JScrollPane?

时间:2014-03-19 17:01:06

标签: java swing jpanel jscrollpane

基于数据库中的一些东西,我在程序开始时以编程方式将大量组件(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。

2 个答案:

答案 0 :(得分:8)

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

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

添加组件什么也不做,因为组件的大小仍为零,因此无需绘制任何内容。当您调用revalidate()方法时,将调用布局管理器,以便组件现在具有位置/大小。然后repaint()将绘制组件。 revalidate()还将导致滚动条在需要时显示。这当然假设您正在使用布局管理器。

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

答案 1 :(得分:0)

仅在我的情况下

frame.pack();
当封闭的JPanel动态调整大小时,

帮助获取JScrollPane上的滚动条。