3

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

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

我试图(0,0)通过子类化JScrollBar和覆盖setValue()并放置一个断点来弄清楚它的来源,但它没有被击中(但是当我移动滚轮时)所以我假设它是在内部设置的。有谁知道可能会发生什么?

4

1 回答 1

3

Try another way to call the code after revalidate() buf before repaint().

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

Alternatively you can try to call panel.scrollRectToVisible(Rectangle)

于 2013-08-09T09:20:48.953 回答