问题描述
panel.add(...);
panel.add(...);
panel.revalidate();
panel.repaint();
添加组件不会执行任何操作,因为该组件的大小仍为零,因此无需绘制任何内容。当您调用revalidate()方法时,将调用布局管理器,因此组件现在将具有位置/大小。然后repaint()将绘制组件。revalidate()也将在需要时显示滚动条。当然,这假设您正在使用布局管理器。
组件被添加到面板中,因此您可以调用面板上的方法,而不是滚动窗格。
解决方法
我在程序开始时,根据数据库中的某些内容,以编程方式在JScrollPane中添加了许多组件(JPanels,JLabels等)。
似乎对于GUI(?)而言,此过程太快了,因此JScrollPane并不总是正确更新,即,即使内部JPanel大于可见区域,滚动条也不可见。
调整窗口大小(JFrame)可以解决此问题,因为我认为Java在调整组件大小时会重新打印它们。
作为测试,我添加了一个调试按钮,程序启动完成后可以单击该按钮。我正在尝试强制JScrollPane“刷新”自身。
我试着做:
scrollpane.repaint();
scrollpane.validate();
scrollpane.revalidate();
他们似乎都不起作用。但是,如果更改边框(或与JScrollPane相关的任何其他布局),则它将正确刷新。
scrollpane.setBorder(new LineBorder(Color.RED));
所以我基本上有两个问题。
-
强制滚动窗格“刷新”的命令是什么?显然,当我添加边框时,它正在执行某种“重绘”操作。我该怎么办?
-
有没有一种在添加组件时“暂停”打印并在添加所有所需组件之后再次恢复打印的方法?现在,我基本上可以“看到”正在屏幕上添加的组件(即使它确实非常快)。如果我可以添加所需的所有组件,然后告诉程序将其打印到屏幕/ JFrame,那会更好。