java - 当使用scrollRectToVisible()时,需要调用两次才能正确固定位置。怎么修?

标签 java swing scroll jpanel jscrollpane

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

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

代码如下:

protected 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()

关于java - 当使用scrollRectToVisible()时,需要调用两次才能正确固定位置。怎么修?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20836109/

相关文章:

java - Derby 的另一个实例可能已经使用嵌入式数据库启动了数据库

java - 为什么我的程序在循环中跳过提示?

java - 如何在java中随机绘制的图像上添加mouselistener?

java - POJO的优势是什么?

java - 如何设置背景图片?

Java/Swing : Trying to get BorderLayout to play nice with GridBagLayout

java - 从组件获取文本属性

visual-c++ - CScrollView 偏移客户端矩形与滚动位置

jquery - 检查元素是否滚动到顶部

html - 滚动在小分辨率下不起作用