12.12 使用FormattedTextField和JTextPanel创建格式文本 12.11 使用JTable和TableModel创建表格
12.12 使用FormattedTextField和JTextPanel创建格式文本
Swing
使用JtextComponent
作为所有文本输入组件的父类,从图12.1中可以看出:Swing
为JtextComponent
类提供了三个子类:JTextArea
、JTextField
和JEditorPane
.
JEditorPane
为JEditorPane
提供了一个JTextPane
子类,JEditorPane
和JTextPane
是两个典型的格式文本编辑器,也是本节介绍的重点。
JTextArea
和JTextField
是两个常见的文本组件,比较简单,本节不会再次介绍它们。
JTextField
JTextField
派生了两个子类:JPasswordField
和JFormattedTextField
,它们代表密码输入框和格式化文本输入框。
文本输入组件的model是Document接口
与其他的Swing
组件类似,所有的文本输入组件也遵循了MVC
的设计模式,即每个文本输入组件都有对应的model
来保存其状态数据;
与其他的Swing
组件不同的是,文本输入组件的model
接口不是XxxModel
接口,而是Document
接口。
Document
既包括有格式的文本,也包括无格式的文本。不同的文本输入组件对应的Document
不同。
12.12.1 监听Document的变化
如果希望检测到任何文本输入组件里所输入内容的变化,则可以通过监听该组件对应的Document
来实现。
如何获取文本输入组件的Document对象
JTextComponent
类里提供了一个getDocument()
方法,该方法用于获取所有文本输入组件对应的Document
对象。
JTextComponent 类的方法 |
描述 |
---|---|
Document getDocument() |
Fetches the model associated with the editor. |
为Document添加监听器
Document
提供了一个addDocumentListener()
方法来为Document
添加监听器,该监听器必须实现DocumentListener
接口.
Document 接口的方法 |
描述 |
---|---|
void addDocumentListener(DocumentListener listener) |
Registers the given observer to begin receiving notifications when changes are made to the document. |
DocumentListener接口方法
DocumentListener
接口里提供了如下三个方法。
方法 | 描述 |
---|---|
void changedUpdate(DocumentEvent e) |
当Document 里的属性或属性集发生了变化时触发该方法。 |
void insertUpdate(DocumentEvent e) |
当向Document 中插入文本时触发该方法。 |
void removeUpdate(DocumentEvent e) |
当从Document 中删除文本时触发该方法。 |
对于上面的三个方法而言,如果仅需要检测文本的变化,则无须实现第一个方法。但Swing
并没有为DocumentListener
接口提供适配器,所以程序依然要为第一个方法提供空实现。
撤销监听器
除此之外,还可以为文件输入组件添加一个撤销监听器,这样就允许用户撤销以前的修改。添加撤销监听器的方法是addUndoableEditListener
:
Document 接口的方法 |
描述 |
---|---|
void addUndoableEditListener(UndoableEditListener listener) |
Registers the given observer to begin receiving notifications when undoable edits are made to the document. |
UndoableEditListener
该方法需要接收一个UndoableEditListener
监听器,该监听器里包含了undoableEditHappened()
方法:
UndoableEditListener 接口的方法 |
描述 |
---|---|
void undoableEditHappened(UndoableEditEvent e) |
当文档里发生了可撤销的编辑操作时将会触发该方法 |
程序 为文本域的Document添加监听器
下面程序示范了如何为一个普通文本域的Document
添加监听器,当用户在目标文本域里输入、删除文本时,程序会显示出用户所做的修改。该文本域还支持撤销操作,当用户按“Ctrl+Z
”键时,该文本域会撤销用户刚刚输入的内容。
1 | import java.util.LinkedList; |
代码分析
上面程序中的两段粗体字代码实现了Document
中插入文本、删除文本的事件处理器,当用户向Document
中插入文本、删除文本时,程序将会把这些修改信息添加到下面的一个文本域里
添加可撤销操作监听器
程序中①号代码:
1 | // 添加可撤销操作的监听器 |
是可撤销操作的事件处理器,当用户在该文本域内进行可撤销操作时,这段代码将会被触发,这段代码把用户刚刚进行的可撤销操作以List
保存起来,以便在合适的时候撤销用户所做的修改。
添加Ctrl+Z监听器
程序中②号代码:
1 | // 为Ctrl+Z添加监听器 |
主要用于为“Ctrl+Z
”按键添加按键监听器,当用户按下“Ctrl+Z
”键时,程序从保存可撤销操作的List
中取岀最后一个可撤销操作,并撤销该操作的修改。
运行上面程序,会看到如图12.58所示的运行结果。