Java >> 7. Java 的图形用户界面
Applet生命周期:小应用程序的整个运行过程,可分为4个阶段——初始化、启动、停止和退出。初始化:初始化对应的方法是init(),它是小应用程序的入口点。在init() 方法中,一般进行如设置程序初始状态、载入图片或字体、获取HTML 参数等工作;启动:启动对应的方法是start(),在init() 方法执行之后自动执行start() ;停止:停止的对应方法是stop();退出:退出...
Applet
生命周期:小应用程序的整个运行过程,可分为4个阶段——初始化、启动、停止和退出。
- 初始化:初始化对应的方法是init(),它是小应用程序的入口点。在init() 方法中,一般进行如设置程序初始状态、载入图片或字体、获取HTML 参数等工作;
- 启动:启动对应的方法是start(),在init() 方法执行之后自动执行start() ;
- 停止:停止的对应方法是stop();
- 退出:退出对应的方法为destroy()
java.awt 与图形用户界面
在Java 中,图形用户界面(GUI)的每一部分都是由swing 和awt 包描述的。要创建或显示一个界面,首先应创建对象,设置它们的变量,然后调用它们的方法。当把图形用户界面组装在一起,实际使用了两种对象:组件和容器。
标签和文本域
标签仅仅用于显示一行文本,其内容只能在程序中设置或更改。
java.awt.Label 用来实现它。
import java.awt.*;
import java.applet.Applet;
public class phone extends Applet {
Label la1 = new Label();
public void init() {
this.setLayout(new FlowLayout());
la1.setText("Hi waao");
this.add(la1);
}
}
运行结果:
其中Label() 是构造方法,它生成一个不包含显示内容的标签对象。
从这个程序中可见在小应用程序中加入组件需要如下3步:
- 用相应的构造方法来生成组件对象;
- 在init() 方法中用setLayout 设置布局,可以使用默认布局;
- 在init() 方法中用this.add(组件对象名) 在小应用程序中显示组件。
import java.awt.*;
import java.applet.*;
public class phone extends Applet {
TextField name = new TextField(30);
TextField pw = new TextField(30);
Label la1 = new Label();
Label la2 = new Label();
public void init() {
this.setLayout(new FlowLayout());
la1.setText("name:");
this.add(la1);
this.add(name);
la2.setText("password:");
this.add(la2);
pw.setEchoChar('*');
this.add(pw);
pw.getText();
}
}
结果:
此外TextField 还有三种重载的构造方法可以选用:
TextField() /* 生成一个不显示任何信息的文本域 */
TextField(String text) /* 用初始文本构造一文本域 */
TextField(String text, int columns) /* 指定初始文本、列数、构造一文本域 */
TextField 类常用其他方法如表:
方法 | 功能 | 返回类型 |
---|---|---|
addActionListener(ActionListener 1) | 加入一个ActionListener 对象用于接收在文本域上发生的动作事件 | void |
getListeners(class ListenerType) | 返回由addxxListener 设置的所有监听器组成的数组 | EventListener[] |
removeActionListener(ActionListener 1) | 撤销监听器1 | void |
setEchoChar(char c) | 设置文本域的回显字符 | void |
getEchoChar() | 返回用于回显的字符 | char |
getColumns() | 返回文本域列数 | int |
getColumns(int i) | 设置文本域列数 | void |
setText(String text) | 设置文本域的显示内容 | void |
getText() | 返回文本域的显示内容 | String |
Java 中的事件处理机制
编程方法:
- 程序开始加上
import java.awt.event.*
语句。(对java.awt 中的组件实现事件处理都必须引入java.awt.event 包) - 实现事件监听者所对应的接口,即添加:implements xxListener(事件所对应的接口)
- 设置事件监听者:事件源.addxxListener(事件监听者)
- 编程实现对应事件接口中的全部方法
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class My_application extends Applet implements ActionListener {
TextField name = new TextField(30);
TextField pw = new TextField(30);
TextField pw2 = new TextField(30);
Label la1 = new Label("name");
Label la2 = new Label(" password");
Label la3 = new Label(" show password");
public void actionPerformed(ActionEvent e) { /* actionPerformed 是ActionListener 接口中的一个抽象方法 */
pw2.setText(pw.getText());
}
public void init() {
this.setLayout(new FlowLayout());
this.add(la1);
this.add(name);
this.add(la2);
pw.setEchoChar('*');
pw.addActionListener(this);
this.add(pw);
this.add(la3);
this.add(pw2);
}
}
结果:
password 输入密码后键入回车,show password 就会显示出密码明文
事件传递过程:
- 文本域pw 中输入回车
- 触发ActionEvent
- 传递给小应用程序
- 执行actionPerformed(ActionEvent e)
这种编程方法的缺点在于无法使用适配器来处理事件,因为Java 不支持多继承,程序不能同时有Applet 和事件适配器两个直接超类
换一种编程风格:事件的监听器不是小应用本身,而是专门定义的事件监听器对象。
此程序功能和前同:
public class My_application extends Applet {
TextField name = new TextField(30);
TextField pw = new TextField(30);
TextField pw2 = new TextField(30);
Label la1 = new Label("name");
Label la2 = new Label(" password");
Label la3 = new Label(" show password");
class PasswordHandle implements ActionListener {
public void actionPerformed(ActionEvent e) {
pw2.setText(pw.getText());
}
}
public void init() {
this.setLayout(new FlowLayout());
this.add(la1);
this.add(name);
this.add(la2);
pw.setEchoChar('*');
pw.addActionListener(new PasswordHandle());
this.add(pw);
this.add(la3);
this.add(pw2);
}
}
事件处理流程:
- 文本域pw 中键入回车;
- 触发ActionEvent;
- 传递给PasswordHandle 类对象。
在事件源—密码域pw 中键入回车时,触发ActionEvent,该事件并不传递给容器Applet 也不由事件源本身处理,而是传递给pw 对象的动作事件监听者PasswordHandle 类的对象,然后该对象自动调用其actionPerformed(ActionEvent e) 方法来处理事件。
ActionEvent 类有3个常用的方法:
- String getActionCommand():返回动作命令字符串。
该字符串默认值为事件所对应组件的标签。 - int getModifiers():返回按键的值。
- object.getSource():返回事件源对象。该方法为ActionEvent 类从祖父类java.util.EventObject 中继承的方法。
除了xxListener 接口外,每个拥有超过一个方法的接口还配有xxAdapter(适配器),适配器是一个类,它为相应接口的每个方法提供一个默认的方法(一般都是不做任何事情的空方法),这样在处理相应事件时,我们可以简单地继承适配器并只对需要覆盖的方法进行编写,而不必对每个接口中的方法都实现。
使用适配器的目的仅仅是简化编程。
键盘事件(KeyEvent)涉及的接口是KeyListener,该接口就有相应的适配器—KeyAdapter。
KeyListener 有三个方法:
- public void keyPressed(KeyEvent e):处理当某键被按下时触发的事件;
- public void keyReleased(KeyEvent e):处理当某键被放开时触发的事件;
- public void keyTyped(KeyEvent e):处理当某键被按下后又被放开时触发的事件。
tf1 区域每按下一个键,tf2 就会输出相同的字符:
public class Key_application extends Applet {
Label lb1 = new Label("name");
Label lb2 = new Label("address");
TextField tf1 = new TextField(10);
TextField tf2 = new TextField(10);
class TextFieldKeyListener extends KeyAdapter {
public void keyReleased(KeyEvent e) {
tf2.setText(tf1.getText());
}
}
public void init() {
add(lb1);
add(tf1);
add(lb2);
tf1.addKeyListener(new TextFieldKeyListener());
add(tf2);
}
}
这里TextFieldKeyListener 继承自KeyAdapter,故不需要每个方法都进行实现,只需要实现一个或几个即可
更多推荐
所有评论(0)