1、第9章 文本框和文本区,在第6章介绍了组件和容器的概念,第7章介绍了Java Applet的基本概念。我们已经知道,Java Applet本身也是一个容器(准确地说,Java Applet的主类的实例是一个容器),因此Java Applet可以添加交互组件,如文本框、文本区、按钮、滚动列表等。本章学习文本框和文本区。 91 文本框 文本框可以输入单行的文本,你肯定对它不陌生。java.awt包中的TextField类是专门用来建立文本框的,即TextField创建的一个对象就是一个文本框。 TextField类有下列主要方法: (1)TextField() 如果使用这个构造方法创建文本框对象,
2、则文本框的长度为一个字符长,可以在文本框中输入若干个字符。 (2)TextField(int x) 如果使用这个构造方法创建文本框对象,则文本框的长度为x个字符长,可以在文本框中输入若干个字符。 (3)TextField(String s) 如果使用这个构造方法创建文本框对象,则文本框的初始字符串为s,可以在文本框中输入若干个字符。 (4)TextField(String s,int x) 如果使用这个构造方法为s,文本框的长为x,可以在文本框中输入若干个字符。 (5)public void setText(String s) 文本框对象调用该方法可以设置文本框中的文本为参数s指定的文本,文本
3、框中先前的文本将被清除。 (6)public String getText() 文本框对象调用该方法可以获取文本框中的文本。,(7)public void setEchoChar(char c) 文本框对象调用该方法可以设置文本框的回显字符,这样当用户在文本框中进行文字输入时,在文本框中只显示参数c指定的字符。 (8)public void setEditable(boolean b) 文本框对象调用该方法可以指定文本框的可编辑性。创建的文本框默认为可编辑的。 (9)public void addActionListener(ActionListener) 文本框对象调用该方法可以向文本框增加
4、动作监视器(将监视器注册到文本框)。 (10)public void removeActionListener(ActionListener) 文本框对象调用该方法可以移去文本框上的动作监视器。 下面的例子text1.java中有3个文本框。,92 文本框上的ActionEvent事件,当用户在文本框中键入文本后,按回车键、单击按钮、在一个下拉式列表表中选择一个条目等操作时,都发生界面事件。程序有时需对发生的事件作出反应,宋实现特定的任务,例如,用户单击一个名字叫“确定”或“取消”的按钮,程序可能将作出不同的处理。在学习处理事件时,必须很好地掌握事件源、监视器、处理事件的接口这三个概念。在这一
5、节,通过处理文本框这个具体的组件上的事件,来掌握处理事件的基本原理。 1事件源 能够产生事件的对象都可以成为事件源,如文本框、按钮、下拉式列表等。也就是说,事件源必须是一个对象,而且这个对象必须是Java认为能够发生事件的对象。 2监视器 我们需要一个对象对事件源进行监视,以便对发生的事件作出处理。事件源通过调用 相应的方法将某个对象作为自己的监视器。例如,对于文本框,这个方法是:addActionListener(监视器)对于获取了监视器的文本框对象,在文本框获得输入焦点之后,如果用户按回车键,Java运行系统就自动用ActionEvent类创建了一个对象,即发生了ActionEvent事件
6、。也就是说,事件源获得监视器之后,相应的操作就会导致事件的发生,并通知监视器,监视器就会作出相应的处理。,3处理事件的接口 Java规定:为了让监视器这个对象能对事件源发生的事件进行处理,创建该监视器对象的类必须声明实现相应的接口,即必须在类体中给出该接口中所有方法的方法体,那么当事件源发生事件时,监视器就自动调用执行被类实现的某个接口方法。java.awt.event包中提供了许多事件类和处理各种事件的接口。对于文本框这个接口的名字是ActionListener,这个接口中只有一个方法: public void actionPerformed(ActionEvent e)当在文本框中输入字符
7、并回车时,java.awt.event包中的ActionEvent类自动创建了一个事件对象,并将它传递给方法actionPerformed(ActionEvent e)中的参数e,监视器将自动调用方法:actionPerformed(ActinEvent e) 对发生的事件作出处理。所以,我们称文本框这个事件源可以发生ActionEvent类型事件。为了能监视到这种类型的事件,事件源必须使用addActionListener方法获得监视器;创建监视器的类必须实现接口ActionListener。 现在,我们将文本框对象上的事件处理总结如下: (1)对于文本框事件源,可以发生ActionEven
8、t事件文本框获得监视器之后,在文本框获得输入焦点之后按回车,java.awt.envent包中的ActionEvent类自动创建了一个事件对象。 (2)文本框获得监视器发生ActionEvent事件的事件源获得监视器的方法是:addActionListener(监视器)由于文本框可以发生ActionEvent事件,所以TextField类提供了addActionListener方法。,(3)处理事件的接口处理发生ActionEvent事件的接口是ActionListener,该接口中只有一个的方法: actionPerformer(ActinEvent e)文本框可以发生ActionEvent
9、事件,因此,创建文本框的监视器的类必须要实现ActionListener接口。当在文本框中回车时,java.awt.event包中的ActionEvent类自动创建了一个事件对象,这个对象将自动传递给方法actionPerformed(ActionEvent e)中的参数e,监视器将自动调用方法actionPerformed(ActinEventxe)对发生的事件作出处理。 (4)ActionEvent类中的方法public Object getSource() ActionEvent对象调用方法getSource()可以获取发生ActionEvent事件的事件源对象的引用。public St
10、ring getActionCommand() ActionEvent对象调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个命令字符串,对于文本框,当发生ActionEvent事件时,文本框中的文本字符串就是和该事件相关的一个命令字符串。 Java事件处理就是基于这种授权模式,即发生相应事件的事件源对象,比如sourceObicet,通过调用相应的方法 sourceObjcetaddXXXListener(监视器);将某个对象作为自己的监视器。创建监视器对象的类必须实现相应的事件接口: XXXListener当事件源发生事件时,监视器将调用接口中相应的方法作出处理。事件的处
11、理过程如图:,事件源.addXXXListener(监视器),发生XXX事件,java.awt.event包中的XXXEvent类产生一个对象e,class A implements XXXListener,接口方法(XXX e) ,类A负责创建监 视器,A必须实现 XXX接口,例子textevent.java中 textl.addActionListener(this); 这句话是为text1添加动作监视器,这个this就是动作监视器了,因为这条语句写在init()方法中所以this代表的是当前这个类中的实例化对象,也就是我们看到的Applet容器 例子text3.java中在第一个文本框中
12、输入数字,文本框2,3之中分别显示他的平方和立方 注:如果用户没有在文本框中输入任何字符,文本框调用getText方法将返回一个长度为0的字符串,即不含有任何字符的字符串:“。可以通过getText方法返回的字符串的长度来判断用户是否输入了字符。,93 文本区,文本区框可以输入多行的文本,你肯定对它不陌生。javaawt包中的类TextArea类是专门用来建立文本区的,即TextArea创建的一个对象称做一个文本区。TextArea类中有下列主要方法: (1)TextArea() 如果使用这个构造方法创建文本区对象,则文本区的列数和行数取默认值。文本区有水平和垂直滚动条。 (2)TextAre
13、a(String s) 如果使用这个构造方法创建文本区对象,则文本区的初始字符串为s。文本区有水平和垂直滚动条。 (3)TextArea(int x,int y) 如果使用这个构造方法创建文本区对象,则文本区行数为x,列数为y。文本区有水平和垂直滚动条。 (4)TextArea(String s,int x,int y) 如果使用这个构造方法创建文本区对象,则文本区的初始字符串为s,文本框行数为x,列数为y。文本区有水平和垂直滚动条。 (5)TextArea(String s,int x,int y,int scrollbar) 如果使用这个构造方法创建文本区对象,则文本区的初始字符串为s,文
14、本框行数为x,列数为y。scrollbar取值: TextArea.SCROLLBARS_BOTH /水平和垂直都有 TextArea.SCROLLBARS_VERTICAL_ONLY /只有垂直的 TextArea.SCROLLBARS_HORIZONTAL_ONLY /只有水平的 TextArea.SCROLLBARS_NONE /没有滚动条 控制文本区滚动条的显示状态。,(6)public void setText(String s) 文本区对象调用该方法可以将文本区中的文本设置为参数s指定的文本,文本区中先前的文本将被清除。 (7)public String getText() 文本区
15、对象调用该方法可以获取文本区中的文本。 (8)public void setEditable(boolean b) 文本区对象调用该方法可以指定文本区的可编辑性。文本区默认是为可编辑的。 (9)public boolean isEditable() 文本区对象调用该方法可以获取文本区是否是可编辑的,当文本区是可编辑时,该方法返回true,否则返回false。 (10)public void insert(String s,int x) 文本区对象调用该方法可以在指定位置x处,插入指定文本s。x是指距文本区开始处字符的个数,x不能大于文本区中字符的个数。 (11)public void repl
16、aceRange(String s,int start,int end) 文本区对象调用该方法可以用给定新文本s替换从指定位置start开始到指定位置end结束的文本,start和end不能大于文本区中字符的个数。 (12)public void append(String s) 文本区对象调用该方法可以在文本区中尾加文本。 (13)int getCaretPosition() 文本区对象调用该方法可以获取文本区中输入光标的位置。 (14)public void setCaretPosition(int position) 文本区对象调用该方法可以设置文本区中输入光标的位置,其中positio
17、n不能大于文本区中字符的个数。(15)String getSelectedText() 文本区对象调用该方法可以获取文本区中选中的文本,例如,通过拖动鼠标选中的文本。,(16)public int getSelectionStart() 文本区对象调用该方法可以获取被选中的文本的开始位置。 (17)public int getSelectionEnd() 文本区对象调用该方法可以获取被选中的文本的结束位置。 (18)public void setSelectionStart(int n) 文本区对象调用该方法可以设置文本区中被选中的文本的开始位置,其中n不能大于文本区中字符的个数。 (19)p
18、ublic void setSelectionEnd(int n) 文本区对象调用该方法可以设置文本区中被选中的文本的结束位置,其中n不能大于文本区中字符的个数。 (20)public void selectAll() 文本区对象调用该方法选中文本区的全部文本。 (21)addTextListener(TextListener) 文本区对象调用该方法可以向文本区增加文本监视器。 (22)removeTextListener(TextListener) 文本框对象调用该方法可以移去文本区上的文本监视器。 例子area1.java中演示了,几个方法的应用以及如何把文本区加入到容器之中。,94 文本
19、区上的TextEvent事件,文本区可以发生TextEvent事件。当文本区中的内容发生变化时,例如键入字符、删除字符时,都会导致文本区中的内容发生变化,这时,TextEvent类将自动创建一个事件对象。现在,我们将文本区对象上的事件处理总结如下: 1TextEvent事件对于文本区事件源,可以发生TextEvent事件。当文本区获得监视器之后,在文本区域中改变文本的内容,如键入字符、删除字符时,TextEvent类将自动创建一个事件对象。 2文本区获得监视器发生TextEvent事件的事件源获得监视器的方法是addTextListener(监视器)。由于文本区可以发生TextEvent事件,
20、所以TextArea类提供了addTextListener方法。 3处理事件的接口处理发生TextEvent事件的接口是TextListener,该接口中只有一个方法: textValueChanged(TextEvent e) 4TextEvent类中的方法public Object getSource() 获取发生TextEvent事件的事件源对象的引用。在下面的例子area2.java中,有两个文本区。当我们在一个文本区中输入若干英文单词时(用空格、逗号或回车作为单词之间的分隔符),另一个文本区同时对你输入的英文单词按字典序排序,也就是说随着你输入的变化,另一个文本区不断地更新排序。,习题,1编写有两个文本区的小应用程序。当我们在一个文本区中输入若干个数时,另一个文本区同时对你输入的数进行求和运算并求出平均值,也就是说随着你输入的变化,另一个文本区不断地更新求和及平均值。 2文本区可以使用getSelectedText()方法获取该文本区通过拖动鼠标选中的文本。上机练习习题4, 要求在textl中输入一篇英文短文,然后用鼠标把英文短文中的动词选出来放入另一个文本区。,