Java 使用scrollRectToVisible()时,需要调用两次才能正确定位。如何修复?

Java 使用scrollRectToVisible()时,需要调用两次才能正确定位。如何修复?,java,swing,scroll,jpanel,jscrollpane,Java,Swing,Scroll,Jpanel,Jscrollpane,我的案例是:在我的项目中有两个选项卡视图,在JScrollPane中有选项卡A视图显示列表和选项卡B显示图表。 功能是:单击选项卡A中的一个列表项,它将转到选项卡B并滚动到指向的图表X(可能是第一个,也可能是第二个…) 问题是:如果单击选项卡A中的一项,选项卡B视图将滚动到最后一个图表(在JScrollPane的底部)。然后转到选项卡A,单击另一项,选项卡B应滚动至第一个图表(在JScrollPane顶部)。 但是,JScrollPane仍然固定在底部。 但如果我转到选项卡A并再次单击相同的项目

我的案例是:在我的项目中有两个选项卡视图,在JScrollPane中有选项卡A视图显示列表和选项卡B显示图表。 功能是:单击选项卡A中的一个列表项,它将转到选项卡B并滚动到指向的图表X(可能是第一个,也可能是第二个…)

问题是:如果单击选项卡A中的一项,选项卡B视图将滚动到最后一个图表(在JScrollPane的底部)。然后转到选项卡A,单击另一项,选项卡B滚动至第一个图表(在JScrollPane顶部)。 但是,JScrollPane仍然固定在底部。 但如果我转到选项卡A并再次单击相同的项目,选项卡B可以正确地滚动到第一个图表

代码如下:

受保护的void buildUI() { setLayout(新的BorderLayout())

}

我尝试了以下滚动代码,但没有一个工作正常:

myChartPanel.scrollRectToVisible(focusChart.getBounds())

myGraphViewPane.getVerticalScrollBar().setValue(focusChart.getLocation().x)

myGraphViewPane.getViewport().setViewPosition(新点(focusChart.getLocation().x,chartView.getLocation().y))


为什么只点击两次,就可以滚动到正确的位置?真奇怪

尝试包装myChartPanel.scrollRectToVisible(focusChart.getBounds())调用
SwingUtilities.invokeLater()

为了更快地获得更好的帮助,发布一个。没有问题,也没有在JViewport中居中,不知道在您的情况下发生了什么(invokeLater是无用的,因为这个方法没有滚动),为了更好的帮助,更快地发布一个SSCE、简短、可运行、可编译的上午问题
   myChartPanel = new JPanel( new GridBagLayout() );

   // add different charts for different Item in Tab A
   myChartPanel.add(..) 

   myGraphViewPane = new JScrollPane();
   Border scrollPaneBorder = myGraphViewPane.getBorder();
   myGraphViewPane.setBorder( null );

   //Set single graph view visible by default
   myGraphViewPane.setViewportView( myChartPanel );

   add( myGraphViewPane, BorderLayout.CENTER );
   setBorder( scrollPaneBorder );