我有一个JScrollPane与JPanel。我在JPanel上也有许多不同的组件(例如标签、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()中)时,滚动条移动到末尾。当我设置同样的大小,滚动条移动到奇怪的,固定的位置。
我该如何预防?滚动条应该保持当前位置
我终于在这里找到了答案:https://stackoverflow.com/a/5230477/5694159(感谢Johan M)关于JTextArea而不是JPanel的主题。当refreshData()在单独的线程中调用时,它工作得很好。