我的情况是:我的项目中有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()
中