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

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

代码如下:


  受保护的void buildUI()
     {
         setLayout(new BorderLayout());

   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 );

  
  }


我试过下面的滚动代码,没有一个很好地工作:


  myChartPanel.scrollRectToVisible(focusChart.getBounds());


要么


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


要么


  myGraphViewPane.getViewport()。setViewPosition(new Point(focusChart.getLocation()。x,chartView.getLocation()。y));


为什么只单击两次,它可以滚动到正确的位置?这么奇怪!

最佳答案

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

09-10 08:49