我正在使用 JViewport 的子类调试自定义滚动视图的问题。我从自定义 LayoutManager 中的 layoutContainer() 方法打印了一些信息,并看到它被连续调用,没有任何调整大小来触发它。我查看了源代码,似乎 JViewport.setViewPosition() 在每次调用时都会重新验证。我以为那不可能。所以我回到另一个使用标准 JScrollPane 的项目,并添加了以下代码:
myScrollPane.setLayout(new ScrollPaneLayout() {
@Override
public void layoutContainer(Container parent) {
System.out.println("Layout ScrollPane");
super.layoutContainer(parent);
}
});
这证明标准版本也存在同样的问题。有没有一种强大且被接受的方法来解决这个问题?我正在使用我的 JViewport 子类的几个实例来显示波形和其他使用 JViewport.setViewPosition() 实时滚动的内容,并且每 10 毫秒布置一次容器(每次完全相同)是非常低效的。我可以将 JViewport 子类化并覆盖它,但是理解为什么仅仅为了改变视图位置而认为有必要重新验证将有助于我避免产生新问题。目前我很困惑为什么这是必要的。
所以推论的问题是“为什么 JViewport.setViewPosition()”会导致重新验证?