我有一个JScrollPane
,其视口是JPanel
的子类。此面板使用BoxLayout
布局,并且在用户交互时,组件的水平宽度可以更改。当有足够的组件使得需要滚动条时,更改组件的水平大小然后在revalidate()
子类(视口视图)上调用JPanel
将始终导致滚动窗格重置为(0,0)。
我想保留当前视图,所以我设置了一个组件监听器,并在componentMoved()
上将值存储在getLocation()
(这都是在JPanel子类或视口视图中)。在调用revalidate()
之后,我立即用存储的位置(在事件调度线程上)调用setLocation()
。但是,这会导致视图位置设置为(0,0)的跳跃,然后立即跳转到存储的位置。有没有办法阻止JScrollPane
回到(0,0)?有没有更好的方法来告诉它视口视图的大小已经改变了?
我试图通过继承(0,0)
并覆盖JScrollBar
并设置断点来找出setValue()
的来源,但是它没有被击中(但是当时我移动滚轮)所以我认为它是在内部设置的。有谁知道可能会发生什么?
答案 0 :(得分:3)
尝试另一种方法在revalidate()
之后repaint()
buf之后调用代码。
scrollPane.getViewport().setViewPosition(new Point(x,y));
或者,您可以尝试拨打panel.scrollRectToVisible(Rectangle)