我正在尝试使用 jtextarea 开发一个没有滚动条的编辑器,因此如果文本太长而无法放入 jtextarea 中,则应将其拆分为较小的子字符串,这些子字符串可以在 jtextarea 中进行编辑而不显示垂直滚动条,因为它很容易摆脱水平一种是使用 setLineWrap 和 setWrapStyleWord。我曾尝试使用垂直滚动条 adjusmentListener 来监听它的变化,但它不起作用,因为 jtextarea append 和 setText 方法在业务逻辑结束时被激活,所以我尝试使用多线程和 SwingWorker 来调用这些方法但也不起作用。我还尝试毫无希望地调用重绘、重新验证和更新方法。请帮我解决这个问题,并提前致谢。
3 回答
我正在尝试使用 jtextarea 开发一个没有滚动条的编辑器,因此如果文本太长而无法放入 jtextarea 中,则应将其拆分为较小的子字符串,这些子字符串可以在 jtextarea 中进行编辑而不显示垂直滚动条,因为它很容易摆脱水平一种是使用 setLineWrap 和 setWrapStyleWord。
我不确定我是否完全理解这一点。也许你可以进一步解释?为什么不将 JTextarea 放在 JScrollPane 中?如果它包含的文本大于 JTextArea 可以显示的文本,您希望的行为是什么?
我曾尝试使用垂直滚动条 adjusmentListener 来监听它的变化,但它不起作用,因为 jtextarea append 和 setText 方法在业务逻辑结束时被激活,所以我尝试使用多线程和 SwingWorker 来调用这些方法但也不起作用。我还尝试毫无希望地调用重绘、重新验证和更新方法。
如果您想在输入的文本提交到文本组件之前捕获它,请考虑将 DocumentFilter 设置为 JTextArea 的关联文档(PlainDocument)。
正如 Hovercraft Full Of Eels 已经建议的那样,您必须查看Document
,DocumentFilter
和/或DocumentListener
接口。
通过调整这些,您可以完全控制当有人想要附加文本时显示的文本。例如,您可以在添加新文本之前/之后删除文本的第一部分,从而限制文档中的行数/字符数。
关于 textcomponents的Swing 教程在实现 DocumentFilter部分中包含这样一个示例,其中DocumentSizeFilter
该类是您要查找的类(不是 JDK 的一部分,是 Swing 教程代码的一部分)。正如该示例代码中的注释所建议的那样,在附加新文本时删除文档的第一部分将是一个选项,这会使内容过长,但我将其留给您,因为它被标记为作业。
谢谢 Hovercraft 和 Robin 我明白了,你的答案使我走向正确的方向,我在“Core Swing:高级编程”一书中找到了准确的答案,方法是使用 JTextArea.modelToView() 传递 JTextArea 文档长度作为此方法返回的参数一个 Rectangle 对象,其坐标表示最终字符坐标,然后将这些坐标与 JTextArea 的底角进行比较,以查看该最终字符是否到达该底部。