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

Java JScrollPane自动向下滚动到JPanel中的最低组件,java,swing,jscrollpane,Java,Swing,Jscrollpane,在我的JPanel(在JScrollPane中)中,我有几个JTextArea。启动程序时,这些区域由JTextArea.setText(“文本”)填充 问题是,JScrollPane向下滚动到Y位置最低的JTextArea,就好像用户将注意力集中在JTextArea上,而不管它何时填充了文本。我认为如果JScrollPane可能想要滚动到正在使用的“当前”JTextArea,我可以通过在底部填充JTextArea来解决这个问题。它不起作用,所以我假设它只记得最低点,然后出于某种原因停留在那里

在我的JPanel(在JScrollPane中)中,我有几个JTextArea。启动程序时,这些区域由JTextArea.setText(“文本”)填充

问题是,JScrollPane向下滚动到Y位置最低的JTextArea,就好像用户将注意力集中在JTextArea上,而不管它何时填充了文本。我认为如果JScrollPane可能想要滚动到正在使用的“当前”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));
        }
    });
scrollRectToVisible()方法用于添加到视口(包含文本区域的面板)的组件,而不是视口本身。不确定在视口中直接调用时会发生什么

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

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

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

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

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

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

请发布一个runnable,我在尝试重现此问题时没有得到相同的结果。恐怕我无法做到这一点。这个项目相当大,不容易精简,我不想在这里发布所有内容:P无论如何,没有人会花时间去完成所有内容…@XistenZ,
我恐怕无法做到这一点。
-对于未来,你没有被要求参与你的项目。您的问题是有多个文本区域的面板。因此,您可以轻松创建一个JFrame,其中包含一个JScrollPane,包含一个具有多个文本区域的面板。这足以说明问题所在。MCVE的重点是突出问题,而不是项目。很多时候,当你创建MCVE时,你会在简化问题的同时解决问题。我知道,我应该重新措辞并说“我无法重现问题”。当我创建一个JFrame、JScrollPane和多个JTextAreas时,问题并没有重现。在这种情况下,问题显然隐藏在我的项目的某个地方。请发布一个runnable,当我试图重现这个问题时,我没有得到相同的结果。我恐怕无法做到这一点。这个项目相当大,不容易精简,我不想在这里发布所有内容:P无论如何,没有人会花时间去完成所有内容…@XistenZ,
我恐怕无法做到这一点。
-对于未来,你没有被要求参与你的项目。您的问题是有多个文本区域的面板。因此,您可以轻松创建一个JFrame,其中包含一个JScrollPane,包含一个具有多个文本区域的面板。这足以说明问题所在。MCVE的重点是突出问题,而不是项目。很多时候,当你创建MCVE时,你会在简化问题的同时解决问题。我知道,我应该重新措辞并说“我无法重现问题”。当我创建一个JFrame、JScrollPane和多个JTextAreas时,问题并没有重现。在这种情况下,问题显然隐藏在我的项目中的某个地方。在SwingUtilities.invokeLater()中添加这一行就成功了!我正在用代码编辑我的问题,因为你不能在评论中格式化。谢谢在SwingUtilities.invokeLater()中添加这一行就成功了!我正在用代码编辑我的问题,因为你不能在评论中格式化。谢谢