专栏首页JavaEdgeJava Swing 的Document类详解

Java Swing 的Document类详解

Document是用于文本的容器,用作swing文本组件的模型。 此接口的目标是从非常简单的需求(纯文本文本字段)扩展到复杂需求(例如,HTML或XML文档)。

内容

在最简单的级别,文本可以建模为线性字符序列。 为了支持国际化,Swing文本模型使用unicode字符。 文本组件中显示的字符序列通常称为组件的内容 。

要引用序列中的位置,使用的坐标是两个字符之间的位置。 如下图所示,文本文档中的位置可以称为位置或偏移。 这个位置是从零开始的。

在该示例中,如果文档的内容是序列“The quick brown fox”,如上图所示,则单词“The”之前的位置为0,并且单词“The”之后的位置和之前的位置它后面的空格是3.序列“The”中的整个字符序列称为范围 。

以下方法可以访问构成内容的字符数据。

  • getLength()
  • getText(int, int)
  • getText(int, int, javax.swing.text.Segment)

结构

文本很少被简单地表示为无特征内容。 相反,文本通常具有与其相关联的某种结构。 建模的结构取决于特定的Document实现。 它可能就像没有结构(即简单的文本字段)一样简单,或者它可能类似于下图。

结构单元(即树的节点)由Element接口引用 。 每个元素都可以使用一组属性进行标记。 这些属性(名称/值对)由AttributeSet接口定义。

以下方法可以访问文档结构。

  • getDefaultRootElement()
  • getRootElements()

突变

所有文档都需要能够添加和删除简单文本。 通常,通过键盘或鼠标的手势插入和移除文本。 插入或移除对文档结构的影响完全取决于文档的实现。

以下方法与文档内容的变异有关:

  • insertString(int, java.lang.String, javax.swing.text.AttributeSet)
  • remove(int, int)
  • createPosition(int)

通知

必须将有关Document突变传达给感兴趣的观察员。 更改通知遵循为JavaBeans指定的事件模型准则。 在JavaBeans事件模型中,一旦调度了事件通知,就必须在事件源发生任何进一步的突变之前通知所有侦听器。 此外,不保证交货顺序。

通知作为两个单独的事件提供, DocumentEvent和UndoableEditEvent 。 如果通过其api对Document进行突变, DocumentEvent发送到所有已注册的DocumentListeners 。 如果Document实现支持撤消/重做功能, UndoableEditEvent将UndoableEditEvent发送到所有已注册的UndoableEditListener 。 如果撤消了可撤消的编辑,则应从文档触发DocumentEvent以指示它已再次更改。 但是,在这种情况下,应该没有生成UndoableEditEvent因为该编辑实际上是更改的来源,而不是通过其api对Document进行的突变。

前面的文字描述了这个图形。

参考上图,假设左侧显示的组件改变了由蓝色矩形表示的文档对象。 该文档通过将DocumentEvent分派给两个组件视图并将UndoableEditEvent发送到监听逻辑来响应,该逻辑维护历史缓冲区。

现在假设右边显示的组件改变了同一个文档。 同样,文档将DocumentEvent调度到两个组件视图,并将UndoableEditEvent发送到维护历史缓冲区的侦听逻辑。

如果然后回滚历史缓冲区(即最后一个UndoableEdit撤消),则向两个视图发送DocumentEvent,导致它们都反映文档的撤消变异(即删除正确组件的变异)。 如果历史记录缓冲区再次回滚另一个更改,则会向两个视图发送另一个DocumentEvent,导致它们将未撤消的突变反映到文档中 - 即删除左侧组件的突变。

与观察文件突变有关的方法是:

addDocumentListener(DocumentListener) removeDocumentListener(DocumentListener) addUndoableEditListener(UndoableEditListener) removeUndoableEditListener(UndoableEditListener) 字段

文档实现通常在运行时具有一些与它们相关联的属性集。 两个众所周知的属性是StreamDescriptionProperty ,可用于描述Document来源,以及TitleProperty ,可用于命名Document 。 与属性相关的方法是:

getProperty(java.lang.Object) putProperty(java.lang.Object, java.lang.Object) 有关Document类的更多信息,请参阅The Swing Connection ,最特别是文章The Element Interface 。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Error running Tomcat8: Address localhost:1099 is already in use

    这明显是1099端口已经被占用,解决办法如下: 第一步,命令提示符号,执行命令:

    JavaEdge
  • JavaSwing-ItemListener接口

    用于接收项目事件的监听器界面。 对处理项目事件感兴趣的类将实现此接口。 然后使用该类创建的对象使用组件的addItemListener方法向该组件注册。 发生项...

    JavaEdge
  • Java编程思想第五版(On Java8)(四)-运算符

    运算符接受一个或多个参数并生成新值。这个参数与普通方法调用的形式不同,但效果是相同的。加法 +、减法 -、乘法 *、除法 / 以及赋值 = 在任何编程语言中的工...

    JavaEdge
  • 初级算法-动态规划

    动态规划主要是解一些递归问题,也就是将递归写成非递归方式,因为编辑器无法正确对待递归,递归方法会导致很多计算结果被重复计算,比如菲波那切数列。

    方丈的寺院
  • 算法细节系列(21):贪心有理?

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • 程序员面试金典 - 面试题 16.17. 连续数列(DP/分治)

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/contiguous-sequence-lcci 著...

    Michael阿明
  • 漫画:动态规划系列 第二讲

    在上一篇文章中,我们讲解了DP的概念并且通过示例了解了什么是动态规划。本篇中,我们将继续通过1道简单题型,进一步学习动态规划的思想。

    程序员小浩
  • 动态规划设计

    输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

    用户7625070
  • LintCode 解码方法题目分析代码

    样例 给你的消息为12,有两种方式解码 AB(12) 或者 L(12). 所以返回 2

    desperate633
  • 详解三道一维的动态规划算法题

    在一条直线上,有n个房屋,每个房屋中有数量不等的财宝,有一个盗 贼希望从房屋中盗取财宝,由于房屋中有报警器,如果同时从相邻的两个房屋中盗取财宝就会触发报警器。问...

    帅地

扫码关注云+社区

领取腾讯云代金券