JScrollPane自动将ViewPort位置设置为(0,0)

时间:2013-08-09 08:38:24

标签: java swing jscrollpane jviewport

我有一个JScrollPane,其视口是JPanel的子类。此面板使用BoxLayout布局,并且在用户交互时,组件的水平宽度可以更改。当有足够的组件使得需要滚动条时,更改组件的水平大小然后在revalidate()子类(视口视图)上调用JPanel将始终导致滚动窗格重置为(0,0)。

我想保留当前视图,所以我设置了一个组件监听器,并在componentMoved()上将值存储在getLocation()(这都是在JPanel子类或视口视图中)。在调用revalidate()之后,我立即用存储的位置(在事件调度线程上)调用setLocation()。但是,这会导致视图位置设置为(0,0)的跳跃,然后立即跳转到存储的位置。有没有办法阻止JScrollPane回到(0,0)?有没有更好的方法来告诉它视口视图的大小已经改变了?

我试图通过继承(0,0)并覆盖JScrollBar并设置断点来找出setValue()的来源,但是它没有被击中(但是当时我移动滚轮)所以我认为它是在内部设置的。有谁知道可能会发生什么?

1 个答案:

答案 0 :(得分:3)

尝试另一种方法在revalidate()之后repaint() buf之后调用代码。

scrollPane.getViewport().setViewPosition(new Point(x,y));

或者,您可以尝试拨打panel.scrollRectToVisible(Rectangle)