目标:
1.掌握接口和抽象类的格式
2.熟练使用事件机制
1.接口的定义与实现
定义接口的关键字是:interface
格式:
public interface 接口名 extends 接口名,... {
//可以定义常量
public static final 数据类型 常量名 = 值;
//定义抽象方法
public 返回值数据类型 方法名(数据类型 参数名,...);
}
注意:
1.接口中默认的访问修饰符就是public。
2.接口中常量名的每一个字母都必须要大写。(常量直接通过接口名进行调用:接口名.常量名)
3.接口可以继承接口,而且可以同时继承多个接口
4.接口是不能实例化对象的。
实现接口的关键字是:implements
格式:
public class 类名 extends 类或者抽象类 implements 接口名,... {
//类必须要实现(重写)接口中所有的抽下方法
}
类实现接口后有没有特殊的地方呢?
1.接口也是一种类,只是比较特殊
2.类实现(继承)接口后,那么类必须要实现接口中所有的抽象方法。
3.类继承接口后,拥有类继承类的所有特性。
2.抽象类的定义与继承
定义抽象类的关键字:abstract class
格式:
public abstract class 抽象类名 extends 类或者抽象类 implements 接口名,... {
//类中可以定义的内容,抽象类都可以定义
//接口中能定义的内容,抽象类还是可以定义。
public abstract 返回值数据类型 方法名(数据类型 参数名,...);
}
3.接口和类的区别
4.事件机制
1.事件源
你的动作发生在哪一个组件上,那么该组件就是事件源。
只有图形界面类才可以成为事件源对象。
jbuLogin
2.事件监听器方法
监听是否有相应的动作发生,如果发生相应的动作,事件监听器方法
就会被激活,然后调用事件处理类的对象。
事件源对象.add**Listener(**Listener l);
jbuLogin.addActionListener(ActionListener al);
3.事件处理类
最终要执行什么样的内容
自定义的类,去实现对应的事件接口
LoginListener implements ActionListener {
//实现接口的抽象方法
}
5.练习
1.实现QQ登录界面的登录功能
package lxf0630;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
//定义一个QQLogin类
public class QQLogin {
// 定义程序的入口主函数
public static void main(String[] args) {
QQLogin qq = new QQLogin();
qq.initGUI();
}
// 定义一个初始化界面的方法
public void initGUI(){
//1.实例化一个JFrame类的对象
JFrame jf = new JFrame();
//2.设置jf对象的属性值
jf.setTitle("QQ登录界面");
jf.setSize(new Dimension(380,295));
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);//设置窗体显示在屏幕的中央
jf.setResizable(false);//设置禁止调整窗体的大小
//设置窗体的布局方式为边框布局,窗体默认的布局方式就是边框布局
//jf.setLayout(new BorderLayout());
/******************窗体背景*********************/
//实例化一个图标对象
ImageIcon backgroundImage = new ImageIcon("Images/dxy.jpg");
//实例化一个标签对象,让标签显示图标对象
JLabel backgroundJla = new JLabel(backgroundImage);
//设置标签的起始位置和标签的大小
backgroundJla.setBounds(0, 0, backgroundImage.getIconWidth(), backgroundImage.getIconHeight());
//添加到窗体的LayeredPanel面板的最底层(第二层面板)
jf.getLayeredPane().add(backgroundJla,new Integer(Integer.MIN_VALUE));
//获取窗体的第一层面板
JPanel contentPanel = (JPanel)jf.getContentPane();
//设置第一层面板为透明
contentPanel.setOpaque(false);
/************************************************/
/****************北边的面板*********************/
JPanel northPanel = new JPanel();
northPanel.setOpaque(false);//设置面板为透明
northPanel.setPreferredSize(new Dimension(0,120));
//设置面板的布局方式为边框布局,JPanel默认的布局方式是流式布局
northPanel.setLayout(new BorderLayout());
//实例化一个JLabel的对象,并且让标签上显示图标
JLabel jla = new JLabel("");
//jla.setFont(new Font("楷体",Font.BOLD,36));
//将jla对象添加到northPanel对象上
northPanel.add(jla,BorderLayout.WEST);
//将northPanel添加到jf窗体的北边
jf.add(northPanel,BorderLayout.NORTH);
/**********************************************/
/****************西边的面板*********************/
JPanel westPanel = new JPanel();
westPanel.setOpaque(false);//设置面板为透明
//设置面板的布局方式为流式布局,JPanel默认的布局方式是流式布局
westPanel.setLayout(new FlowLayout());
//实例化一个图标(ImageIcon)对象
ImageIcon image = new ImageIcon("Images/QQ图片.jpg");
//实例化一个JLabel的对象,并且让标签上显示图标
JLabel jlaImage = new JLabel(image);
//将jlaImage对象添加到westPanel对象上
westPanel.add(jlaImage);
//将westPanel添加到jf窗体的西边
jf.add(westPanel,BorderLayout.WEST);
/**********************************************/
/****************中间的面板*********************/
JPanel centerPanel = new JPanel();
centerPanel.setOpaque(false);//设置面板为透明
//设置面板的布局方式为流式布局,靠左侧显示组件,JPanel默认的布局方式是流式布局
centerPanel.setLayout(new FlowLayout(FlowLayout.LEFT,8,5));
//实例化组件类的对象
JComboBox jco = new JComboBox();
//设置组件的大小
jco.setPreferredSize(new Dimension(190,25));
//设置jco对象可以编辑
jco.setEditable(true);
jco.addItem("185002513");
jco.addItem("24589663");
jco.addItem("921546465");
jco.setEditable(true);
//将jco对象添加到centerPanel对象上
centerPanel.add(jco);
//String st2=jco.getToolTipText();
JLabel jbuReg = new JLabel("注册账号");
centerPanel.add(jbuReg);
//JTextField jt=new JTextField(st2);
String s=(String)jco.getSelectedItem();
System.out.println(s);
JPasswordField jpa = new JPasswordField();
//设置组件的大小
jpa.setPreferredSize(new Dimension(190,25));
//将jpa对象添加到centerPanel对象上
centerPanel.add(jpa);
JLabel jbuPwd = new JLabel("找回密码");
centerPanel.add(jbuPwd);
JCheckBox jch1 = new JCheckBox("记住密码");
jch1.setOpaque(false);
JCheckBox jch2 = new JCheckBox("自动登录");
jch2.setOpaque(false);
centerPanel.add(jch1);
centerPanel.add(jch2);
//将centerPanel添加到jf窗体的中间
jf.add(centerPanel,BorderLayout.CENTER);
/**********************************************/
/****************南边的面板*********************/
JPanel southPanel = new JPanel();
southPanel.setOpaque(false);//设置面板为透明
//设置面板的布局方式为流式布局,JPanel默认的布局方式是流式布局
southPanel.setLayout(new FlowLayout());
//实例化一个LoginLestener类的对象
LoginListener l=new LoginListener(jpa,jco);
JButton jbuLogin = new JButton("登 录");
jbuLogin.setPreferredSize(new Dimension(155,30));
//jbuLogin.setFont(new Font("楷体",Font.BOLD,36));
//给事件源对象添加动作监听器方法,绑定事件处理类的对象
jbuLogin.addActionListener(l);
//将jbuLogin对象添加到southPanel对象上
southPanel.add(jbuLogin);
//将southPanel添加到jf窗体的南边
jf.add(southPanel,BorderLayout.SOUTH);
/**********************************************/
//设置窗体为可见的代码一定要放置在最后一行
jf.setVisible(true);
}
}
package lxf0630;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
//定义一个事件处理类,该类实现了ActionListener接口
public class LoginListener implements ActionListener{
private JPasswordField jpa;
private JComboBox jco;
//定义一个构造方法将JPasswordField jpa和JComboBox jco传到事件处理类中
public LoginListener(JPasswordField jpa,JComboBox jco) {
this.jpa = jpa;
this.jco = jco;
}
//重写接口中的抽象方法
public void actionPerformed(ActionEvent e) {
System.out.println("你点击了"+e.getActionCommand()+"按钮");
//System.out.println(jpa.getText());
String str = e.getActionCommand();
//获取账号和密码
//String name=jpa.getText();
String act = (String) jco.getSelectedItem();
String pwd = jpa.getText();
if (act.equals("185002513")&&pwd.equals("123456")){
JFrame jf = new JFrame("欢迎使用QQ");
jf.setSize(600, 337);
jf.setLocationRelativeTo(null);//设置窗体显示在屏幕的中央
jf.setResizable(false);//设置禁止调整窗体的大小
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
//实例化一个JLabel的对象
ImageIcon imge1 = new ImageIcon("images/dxy2.jpg");
JLabel jla1 =new JLabel(imge1);
jf.add(jla1);
}
else {
JOptionPane.showMessageDialog(null,
"你输入的账号错误,请重新输入!");
}
}
}