JScrollPane 自动向下滚动到 JPanel 中的最低组件

JScrollPane automagically scrolls down to lowest component in JPanel

在我的 JPanel(位于 JScrollPane 中)中,我有几个 JTextArea。启动程序时,这些区域会填充 JTextArea.setText("text");

问题是 JScrollPane 向下滚动到 Y 位置最低的 JTextArea,就好像用户会把焦点放在 JTextArea 上一样,无论它何时填充文本。我认为如果 JScrollPane 可能想要滚动到正在使用的 "current" JTextArea,我可以通过首先在底部填充 JTextArea 来解决这个问题。它没有用,所以我假设它只记得它的最低点,然后出于某种原因停留在那里。

像这样设置视图没有任何区别。

JScrollPane.getViewPort().scrollRectToVisible(new Rectangle(0,0,1,1));

我通过忽略填充最后一个 JTextAreas 进行了测试,然后 JScrollPane 正在查看 JPanel 的顶部,如我所愿。 发生了什么,为什么忽略我的代码?

更新,选择答案 当 GUI 准备就绪时,您必须稍后设置视口

SwingUtilities.invokeLater(new Runnable() 
    {
        public void run() 
        {
            scrollPane.getViewport().setViewPosition(new Point(0, 0));
        }
    });
JScrollPane.getViewPort().scrollRectToVisible(new Rectangle(0,0,1,1));

scrollRectToVisible() 方法旨在用于添加到视口的组件(包含文本区域的面板),而不是视口本身。不确定在视口上直接调用它时会发生什么。

相反,我会执行以下操作:

scrollPane.getViewPort().setViewPosition( new Point(0, 0) );

请注意,您可能需要将该语句包装在 SwingUtilities.invokeLater() 中,以确保在布局管理器将所有组件放置在面板上之后,代码在 EDT 上执行。