软件开发

当前位置:首页 > 软件开发

《Java核心技术高级特性》(第六章)(续)

6.4文本构件

图6-35展示了Swing类库中包含的所有文本构件,在第I卷第9章你已经看到过其中3.个最常用的构件: JTextFie1d、 JPasswordField 和JTextArea。在下面各节中,我们将介绍其余的文本构件。我们还将讨论JSpinner构件,它包含一个格式化的文本框,以及用来改变其内容的“up(上)" 和“down (下)”小按钮。

新梦想IT职业教育

所有文本构件都可以绘制和编辑存储在实现了Document接口的类的模型对象中的数据。JTextField和JTextArea构件使用的是P1ainDocument,该构件直接存储普通文本的行序列,而不进行任何格式化。

JEditorPane可以展示和编辑各种格式的样式文本(包括字体、颜色等),特别是HTML,参见第6.4.4 节, StyledDocument接口描述了对样式、字体和颜色的额外需求,而HTML Document类实现了这个接口。

JEdi torP ane的子类JTextP ane可以持有样式化的文本和嵌人的Swing构件。我们在本书中将不讨论过于复杂的JTextPane,但是推荐你参考Kim Toley所著的《Core Swing》- -书以了解其中关于此构件十分详细的描述。对于JTextPane类的典型用法,可以查看JDK中的StylePad 演示程序。

6.4.1文本构件 中的修改跟踪

只有当你希望实现自己的文本编辑器时,你才需要面对Document接口的复杂性。然而,这个接口的最常见的用法是:跟踪修改。

有时,你希望只要用户进行了文本编辑,无需等待他点击某个按钮,就马上更新部分用

新梦想IT职业教育

户界面。下面是一个简单的示例:我们显示了三个文本框,用于编辑颜色的红、蓝、绿色调只要这些文本框的内容发生了变化,颜色就应该立即更新。图6-36展示了程序清单6-19中的程序运行起来的样子。

首先请注意,监视键盘点击事件并非好主意,因为有些键盘点击事件并不修改文本(例如,点击方向键)。更重要的是,文本可以因鼠标的姿态变化而改变(例如在X11中的“鼠标中键粘贴”)。因此,应该让文档( document)来通知我们数据发生了变化,方法是在文档(而不是文本构件),上安装文档监听器(document listener):

textField.getDocument0 . addDocumentlistener(1istener);

当文本发生变化时,会调用下列DocumentListener方法之- -:

void insertUpdate (DocumentEvent event)
void removelUpdate(DocunentEvent event)
void changedUpdate (DocumentEvent event)

前两个方法是在插入或移除字符时被调用的,第三个方法对于文本框来说根本不会被调用,而对于更复杂的文档类型,在产生某些其他类型的变化,例如格式上的变化时,这个方法才会被调用。但是,由于没有任何单个的回调可以告诉我们文本发生了变化(通常我们也并不太关心文本发生了怎样的变化),同时也没有任何适配器类。因此,文档监听器必须实现所有这3个方法。下面是我们在示例程序中的做法:

DocunentListener listener = new DocumentListenerO
public void insertUpdateCDocumentEvent event) { setColor0; }
public void removeUpdate(DocumentEvent event) { setCo1or0; }
public void changedUpdate(DocumentEvent event) {}
}

setColor方法使用getText方法从文本框中获得当前的用户输人字符串,并设置其颜色。

我们的程序有一一个限制:用户可以在文本框中键人非数字的畸形输人,例如“ twenty",或者使文本框保持为空。因此,目前我们将捕获parseInt方法抛出的NumberF ormatException,并且在文本框中的内容不是数字时,不执行更新颜色的操作。在下一节,你将会看到可以如何预先防止用户键人无效的输入。

口注意:除了监听文档事件,还可以在文本框上添加一个行为事件监听器。只要用户按下了回车键,动作监听器就会得到通知。我们不推荐这种方法,因为用户在完成数据输入后,并非总是记得按回车键。如果使用动作监听器,就应该同时安装一-个 焦点监听器,这样我们可以跟踪用户何时离开该文本框。

新梦想IT职业教育

新梦想IT职业教育

新梦想IT职业教育


相关内容

文章评论

表情

共 0 条评论,查看全部
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~