【发布时间】:2013-08-09 08:38:24
【问题描述】:
我有一个JScrollPane,其视口是JPanel 的子类。该面板使用BoxLayout 进行布局,并且在用户交互时,组件的水平宽度可以改变。当有足够的组件需要滚动条时,更改组件的水平大小,然后在 JPanel 子类(视口视图)上调用 revalidate() 将始终导致滚动窗格重置为 (0,0 )。
我想保留当前视图,所以我设置了一个组件侦听器,并在componentMoved() 上将值存储在getLocation()(这都在 JPanel 子类或视口视图中)。在调用revalidate() 之后,我立即使用存储的位置(在事件调度线程上)调用setLocation()。但是,这会导致视图位置设置为 (0,0) 的跳跃,然后立即跳转到存储的位置。有没有办法阻止JScrollPane 回到(0,0)?有没有更好的方法来告诉它它的视口视图的大小已经改变?
我试图通过子类化JScrollBar 并覆盖setValue() 并放置一个断点来找出(0,0) 的来源,但它没有被击中(但当我移动滚轮时)所以我认为它是在内部设置的。有谁知道会发生什么?
【问题讨论】:
-
为了尽快获得更好的帮助,请将您的代码发布为SSCCE,以证明您的问题。这允许用户复制/粘贴和重现您的问题。
-
我会的,但我为这个问题开发的 SSCCE 没有显示问题。似乎因为它太小了,“比赛条件”没有发生(我永远看不到跳跃)。我的项目太大了,我不能只发布它,所以我希望我的描述足够好:(
标签: java swing jscrollpane jviewport