如何自定义组件(JavaBean)
程序员可以将已经有的图形组件组合起来,形成新的组件,这就是JavaBean。JavaBean是一种可重复使用并且跨平台的组件。用户可在一个构造工具中以可视化方式操作它。JavaBean可用来绘图、加密解密、实现数据访问、实现FTP等。JavaBean开发阶段首先是构造阶段,涉及创建JavaBean与它的用户界面;其次是执行阶段,涉及把JavaBean放入容器应用的执行。JavaBean的元素包括:
①属性:为包含在JavaBean中私有成员数据。
②方法:包含在JavaBean的公共成员函数中,用来操纵bean属性,暴露bean的功能。
③事件:用来对bean属性值变动或对其他beans状态的变动进行通信。
编写测试JavaBean的四个步骤如下:
a. 编写事件类:必须扩展java.util.EventObject类,确定事件发生时,要传达给客户的参数的类型及数量。
b. 编写构造方法,注意构造方法参数的个数,应该是此类定义放入属性数量+1.
事件监听接口:
此接口的声名为:public interface 接口名 extends EventListener
c. bean类(事件处理程序):应定义addXXListener()和fireXXEvent()方法。
d. 编写目标应用:使用触发自定义事件的bean,首先必须注册它自身为蒂尼时间的一个监听程序。应定义代码,指出在触发自定义事件时必须做的事。
例31.使用JavaBean实现登录窗口
验证用户登录时,通常创建包括两个标签、两个按钮、一个文本框和一个密码框的界面。
package 例31_使用JavaBean实现登录窗口;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
//第一步 封装实现的类
class LoginEvent extends EventObject{
/**
*
*/
private static final long serialVersionUID = -5072939946217322803L;
public String sUserName;
public String sUserPass;
public LoginEvent(Object obj,String sUserName,String sUserPass){
super(obj);
this.sUserName=sUserName;
this.sUserPass=sUserPass;
}
}
//第二步 定义接口
interface LoginListener extends EventListener{
public void validateLogin(LoginEvent mec);
}
//第二步 编写JavaBean
class LoginBean extends JPanel implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
JLabel lblUser=new JLabel("用户名:");
JLabel lblPass=new JLabel("用户名:");
JTextField txtUser=new JTextField(15);
JPasswordField txtPass=new JPasswordField(15);
JButton buttonLogin=new JButton("登录");
JButton buttonCancel=new JButton("取消");
public LoginBean(){
setLayout(new FlowLayout());
add(lblUser);add(txtUser);
add(lblPass);add(txtPass);
add(buttonLogin);buttonLogin.addActionListener(this);
add(buttonCancel);buttonCancel.addActionListener(this);
}
LoginListener mel;
public void addLoginListener(LoginListener mel){
this.mel=mel;
}
LoginEvent mec;
public void fireLoginEvent(LoginEvent mec){
if(mel!=null)
mel.validateLogin(mec);
else
System.out.println("Client not init");
}
public void actionPerformed(ActionEvent ae){
if(ae.getSource()==buttonLogin){
String temp1=txtUser.getText();
String temp2=new String(txtPass.getPassword());
mec=new LoginEvent(buttonLogin,temp1,temp2);
fireLoginEvent(mec);
return;
}
if(ae.getSource()==buttonCancel){
System.exit(0);
}
}
}
//第四步 编写测试类
public class LoginValidator extends JFrame implements LoginListener{
/**
*
*/
private static final long serialVersionUID = 3341214847598574650L;
LoginBean meb;
public LoginValidator(){
super("使用JavaBean实现登录窗口");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
meb=new LoginBean();
getContentPane().add(meb);
meb.addLoginListener(this);
}
public void validateLogin(LoginEvent mec){
String s1=mec.sUserName;
String s2=mec.sUserPass;
JOptionPane.showMessageDialog(this,"用户名是"+s1+"\t密码是"+s2);
}
public static void main(String[] args) {
LoginValidator mec=new LoginValidator();
mec.setSize(300,300);
mec.setVisible(true);
}
@Override
public void handleEvent(Event arg0) {
// TODO Auto-generated method stub
}
}