滚动条在数据刷新后移动

时间:2016-09-09 08:41:33

标签: java swing jpanel jscrollpane jscrollbar

我有一个带有JPanel的JScrollPane。我在JPanel上也有许多不同的组件(例如Labels,JTextFields,JTextAreas)。这些组件以编程方式添加(在运行时,根据用户请求)。 JPanel使用SpringLayout。该程序在添加组件后计算JPanel的首选大小,因为滚动在没有计算的情况下无法正常运行。添加组件和计算首选大小是我的prepareGui()方法的一部分。 组件上显示的数据会定期刷新(在我的refreshData()方法中,由侦听器调用)。

我的问题:刷新后,滚动条始终设置为固定位置(我不知道为什么)。我希望滚动条在刷新后保持原位。

我试图找到一个滚动条移动的地方。我在refreshData()方法的开头和结尾处检查了一些值,但它们是相同的(它们没有在refreshData()内部进行更改):

scrollPane.getVisibleRect().getX()
scrollPane.getVisibleRect().getY()
scrollPane.getVisibleRect().getWidth()
scrollPane.getVisibleRect().getHeight()
panel.getVisibleRect().getX()
panel.getVisibleRect().getY()
panel.getVisibleRect().getWidth()
panel.getVisibleRect().getHeight()
scrollPane.getHorizontalScrollBar().getX()
scrollPane.getHorizontalScrollBar().getY()
scrollPane.getHorizontalScrollBar().getWidth()
scrollPane.getHorizontalScrollBar().getHeight()
scrollPane.getHorizontalScrollBar().getValue()
scrollPane.getVerticalScrollBar().getX()
scrollPane.getVerticalScrollBar().getY()
scrollPane.getVerticalScrollBar().getWidth()
scrollPane.getVerticalScrollBar().getHeight()
scrollPane.getVerticalScrollBar().getValue()

更改布局管理器并没有生效。

我注意到了一件事(我不知道它是否有任何意义)。当我只设置首选大小(在prepareGui()中)时,滚动条移动到结尾。当我设置大小时,滚动条移动到奇怪的固定位置。

我该怎样防止这种情况? 滚动条应保持其当前位置。

1 个答案:

答案 0 :(得分:1)

我终于在这里找到了答案:https://stackoverflow.com/a/5230477/5694159(感谢Johan M)关于JTextArea而不是JPanel的主题。 当refreshData()在单独的线程中调用时,它运行良好。

我希望这个问题和答案对某人有所帮助。