【发布时间】: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