如何强制刷新/重新绘制JScrollPane?

问题描述

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

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));

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

  1. 强制滚动窗格“刷新”的命令是什么?显然,当我添加边框时,它正在执行某种“重绘”操作。我该怎么办?

  2. 有没有一种在添加组件时“暂停”打印并在添加所有所需组件之后再次恢复打印的方法?现在,我基本上可以“看到”正在屏幕上添加的组件(即使它确实非常快)。如果我可以添加所需的所有组件,然后告诉程序将其打印到屏幕/ JFrame,那会更好。

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”