【问题标题】:How to stop JScrollPane from auto scrolling to bottom on initial display?如何阻止 JScrollPane 在初始显示时自动滚动到底部?
【发布时间】:2021-01-25 02:29:19
【问题描述】:

我有一个包裹在 JTextArea 周围的 JScrollPane。当我填充 JTextArea 时,它会自动滚动到底部。我希望它位于顶部。

这是创建它们的代码:

    caption=new JTextArea();
    caption.setLineWrap(true);
    caption.setWrapStyleWord(true);
    scrollCaption=new JScrollPane(caption);
    scrollCaption.setPreferredSize(new Dimension(180,20));
    scrollCaption.setMinimumSize(new Dimension(100,20));

这是填充它的代码:

    int fontsize=scrollCaption.getHeight()/4;
    if (fontsize<10) fontsize=10;
    caption.setFont(caption.getFont().deriveFont((float)fontsize));
        
    String path=textfile.getAbsolutePath();
    List<String> lines=Files.readAllLines(Paths.get(path));
    StringBuilder sb=new StringBuilder();
    for (String line : lines)
    {
        sb.append(line).append('\n');
    }
    caption.setText(sb.toString());
    int scrollmax=scrollCaption.getVerticalScrollBar().getMaximum();
    // scrollCaption.getVerticalScrollBar().setValue(0);
    scrollCaption.getViewport().setViewPosition(new Point(0,0));

我试着说 getVerticalScrollBar().setValue(0) 并且它仍然滚动到底部。然后我尝试了 getViewPort.setViewPosition(new Point(0,0)) 它仍然滚动到底部。也许我做这些太快了?在我这样做之后会发生某种“自动滚动到底部”吗?但我不知道我什么时候才能抓住它。

另一个线索:如果我滚动到顶部,然后调整窗口大小,它会一直滚动到顶部。

我在 Java 8 中运行。

【问题讨论】:

  • 从(非常差的)内存中,我认为您可以禁用插入符号 - 但您也可以将插入符号位置设置为 0 以移回顶部
  • 您在内存中有 3 个文件副本:1)在 List 中,2)在 StringBuilder 中,3)在文本区域的 Document 中。我建议您可以使用 JTextArea 的 read(...) 方法来加载数据。 也许我做这些太快了? - 一些 Swing 方法将通过使用 invokeLater(...) 将代码添加到 EDT。所以是的,setViewPosition(...) 或 setValue(0) 代码可能在 Document 完全构建之前执行。如果 setCaret(0) 建议不起作用,请尝试将 3 个建议中的任何一个包装在 SwingUtilities.invokeLater() 中。
  • @camickr 我将代码更改为使用 JTextArea.read,它可以工作。 (直到昨天我才知道该功能存在。)所以是的,我的程序现在正在运行,但我仍然不明白为什么我的版本不起作用。并且可以很容易地想象 JTextArea 被填充而不是简单地读取文件的场景,所以我相信我迟早会再次遇到这个问题。
  • @Jay 所以我相信我迟早会再次遇到这个问题 - 你得到了使用 SwingUtilities.invokeLater(...) 的解决方案。
  • @camickr 真的,我有 3 个文件副本。但只是短暂的。一旦函数存在,列表和 StringBuilder 将有资格进行垃圾收集。如果我想处理内存中的文件内容,有没有更好的方法来读取它? (我曾经做过很多 Java,但那是 15 年前的事了。现在我只在极少数情况下使用 Java,所以我很生疏。)

标签: java swing jscrollpane


【解决方案1】:

好的,我找到了解决办法。

caption.setCaretPosition(0);

就像许多编程问题一样,只要你知道怎么做就很简单。

我仍然不明白为什么 viewport.setLocation 不起作用。在同一个程序的其他地方,我使用完全相同的函数来滚动同一个文本框。但无论如何。

【讨论】:

  • 没有 setCaretLocation(...) 方法。
  • 哎呀,对不起,setCaretPosition。固定。
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2014-02-27
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多