接口
一、定义接口的格式:
public interface 接口名
二、接口存在的原因:
java是单继承的,一个类只能有一个父类,但一个类可以实现(可以
理解为继承)多个接口 ,接口中可以声明一些方法,当父类实现了这些方法,子类就能继承到父类中的这些方法。这充分发展了软件的灵活性和可
扩展性。
三、类实现接口的格式:
public
class 类名 implements 接口名(,接口名....)
四、接口继承接口的格式:
public interface 接口名 extends 接口名(,接口名....)
事件机制
一、事件:
事件是用户在界面上的一个操作(通常使用各种输入
设备,如:鼠标、键盘等来完成)。
当一个事件发生时,该事件用一个事件对象来表示。事件对象有对应的事件类。不同的事件类描述不同类型的用户动作。事件类包含在java.awt.event和javax.swing.event包中。
二、事件源:
产生事件的组件叫事件源。在一个按钮上单击鼠标时,该按钮就是事件源,会产生一个ActionEvent类型的事件。
三、事件
处理器(事件
处理方法):
事件处理器是一个接收事件对象并进行相应处理的方法。事件处理器包含在一个类中,这个类的对象负责检查事件是否发生,若发生就激活事件处理器进行处理。
四:事件
监听器类:
包含事件处理器,并负责检查事件是否发生,若发生就激活事件处理器进行处理的类叫做事件监听器类。其实例就是事件监听器对象。事件监听器类必须实现事件监听器接口或继承事件监听器适配器类。
事件监听器接口定义了处理事件必须实现的方法。事件监听器适配器类是对事件监听器接口的简单实现。目的是为了减少编程的工作量。
事件监听器接口和事件监听器适配器类也都包含在java.awt.event和javax.swing.event包中。
五、注册事件监听器:
为了能够让事件监听器检查某个组件(事件源)是否发生了某些事件,并且在发生时激活事件处理器进行相应的处理,必须在事件源上注册事件监听器。这是通过使用事件源组件的以下方法来完成的:
addXxxListener(事件监听器对象)
Xxx对应相应的事件类。
六、事件监听器类的编写
1.在事件监听器类的声明中指定要实现的监听器接口名,如:
public class MyListener implements XxxListener {
…
}
2.实现监听器接口中的事件处理方法,如:
public void 事件处理方法名(XxxEvent e) {
...//处理某个事件的代码...
}
然后,在一个或多个组件上可以进行监听器类的实例的注册。如:组件对象.addXxxListener(MyListener对象);
练习:
1.实现
QQ界面的登录功能
2.实现计算器的+、-、*、/运算功能
QQ界面登陆功能的代码:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
//建立一个QQFrame类
public class QQLogin {
// 程序入口
public static void main(String[] args) {
QQLogin qq = new QQLogin();
qq.showLogin();
}
//声明一个
全局的对象名
private LoginListener ll = null ;
// 显示一个加有多个组件的窗体界面
public void showLogin() {
// 构造一个窗体对象
javax.swing.JFrame login = new javax.swing.JFrame();
//设置背景图片
addBackgroundImage(login);
// 设置标题
login.setTitle("QQ 2013");
// 创建流式布局管理器对象
java.awt.FlowLayout fl = new java.awt.FlowLayout();
login.setLayout(fl);
//创建面板对象并设置大小
javax.swing.JPanel jpanel1=new javax.swing.JPanel();
jpanel1.setPreferredSize(new Dimension(400,120));
javax.swing.JPanel jpanel2=new javax.swing.JPanel();
jpanel2.setPreferredSize(new Dimension(250,150));
javax.swing.JPanel jpanel3=new javax.swing.JPanel();
jpanel3.setPreferredSize(new Dimension(100,150));
javax.swing.JPanel jpanel4=new javax.swing.JPanel();
jpanel4.setPreferredSize(new Dimension(200,70));
javax.swing.JPanel jpanel5=new javax.swing.JPanel();
jpanel5.setPreferredSize(new Dimension(150,70));
//设置面板布局
jpanel2.setLayout(new FlowLayout(FlowLayout.LEFT));
//创建一个标签元素
javax.swing.JLabel jla_title = new javax.swing.JLabel("QQ 2013");
jla_title.setFont(new Font("正楷",Font.BOLD,56));
//将组件添加到面板1
jpanel1.add(jla_title);
// 创建2个标签元素:
javax.swing.JLabel jla_ID = new javax.swing.JLabel("注册账号");
javax.swing.JLabel jla_password = new javax.swing.JLabel("找回密码");
//创建一个下拉框
javax.swing.JComboBox jco=new javax.swing.JComboBox();
jco.setEditable(true);//设置下拉框可以编辑
jco.addItem("997188229");// 给下拉框添加数据
jco.setPreferredSize(new Dimension(180, 25));//设置下拉框大小
//创建一个密码框
JPasswordField jpa=new JPasswordField();
jpa.setPreferredSize(new Dimension(180,25));//设置密码框大小
//实例化一个LoginListener事件处理类的对象ll,
//同时将账号和密码输入框对象通过构造方法传入到LoginListener类中
ll = new LoginListener(jco,jpa,login);
// 实例化复选框的对象
JCheckBox jch1 = new JCheckBox("记住密码");
JCheckBox jch2 = new JCheckBox("自动登录");
//将组件元素添加到面板2
jpanel2.add(jco);
jpanel2.add(jla_ID);
jpanel2.add(jpa);
jpanel2.add(jla_password);
jpanel2.add(jch1);
jpanel2.add(jch2);
//创建图片
javax.swing.ImageIcon ima=new javax.swing.ImageIcon();
javax.swing.JLabel jla_ima = new javax.swing.JLabel(ima);
jpanel3.add(jla_ima);
// 实例化一个ImageIcon的图标对象
ImageIcon image = new ImageIcon("src/image/girl.jpg");
// 实例化一个标签对象
JLabel jlaImage = new JLabel(image);
// 将标签对象添加到面板上
jpanel3.add(jlaImage);
// 创建三个按钮
javax.swing.JButton jbu_login = new javax.swing.JButton("登陆");
javax.swing.JButton jbu_muchID= new javax.swing.JButton("多账号");
javax.swing.JButton jbu_set= new javax.swing.JButton("设置");
//给事件源添加一个监听器方法,同时绑定事件处理类的对象ll
jbu_login.addActionListener(ll);
jpanel4.add(jbu_muchID);
jpanel4.add(jbu_set);
jpanel5.add(jbu_login);
// 将面板组件加到窗体上
login.add(jpanel1);
login.add(jpanel3);
login.add(jpanel2);
login.add(jpanel4);
login.add(jpanel5);
login.setSize(400, 400);// 设置窗体大小
//面板设置为透明
jpanel1.setOpaque(false);
jpanel2.setOpaque(false);
jpanel3.setOpaque(false);
jpanel4.setOpaque(false);
jpanel5.setOpaque(false);
login.set
DefaultClose
Operation(3);// 窗体关闭时程序退出
login.setResizable(false);//设置窗体为不可以调整大小
login.setVisible(true);// 让窗体显示出来,这句要放在最后面
}
/**
* 给窗体添加背景图标
*
* @param login窗体的对象
*/
public void addBackgroundImage(JFrame login) {
// 实例化一个ImageIcon的图标对象
ImageIcon image = new ImageIcon("src/image/bluesky.jpg");
// 实例化一个标签对象
JLabel background = new JLabel(image);
// 设置标签显示的位置和标签的大小
background.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());
//将标签添加到窗体的第二层面板上
login.getLayeredPane().add(background,new Integer(Integer.MIN_VALUE));
//获取窗体的第一层面板对象
JPanel contentPanel = (JPanel)login.getContentPane();
//设置第一层面板为透明
contentPanel.setOpaque(false);
}
}
简单计算机的代码:
package lesson7;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
//建立一个Counter类
public class Counter {
private CounterListener co = null;
/**
* 程序运行的入口点
*/
public static void main(String[] args) {
// 实例化一个Class类的对象
Counter cou = new Counter();
// 对象调用显示窗体的方法
cou.showFrame();
}
private JTextField jte = new JTextField();
private JFrame jf;
public void showFrame() {
// 实例化一个窗体对象并且设置标题
jf = new JFrame("简单计算器");
// 设置窗体的大小属性
jf.setSize(300, 330);
// 设置窗体的显示位置
jf.setLocation(200, 100);
// 设置窗体关闭时退出程序
jf.setDefaultCloseOperation(3);
// 设置窗体布局方式
// jf.setLayout(new FlowLayout());
co = new CounterListener(jf, jte);
JPanel northPanel = jp1();
jf.add(northPanel, BorderLayout.NORTH);
JPanel jp2 = jp2();
jf.add(jp2);
// 设置禁止调整窗体的大小
jf.setResizable(false);
// 设置窗体为可见
jf.setVisible(true);
}
// 创建面板1的方法
public JPanel jp1() {
// 实例化一个JPanel类的对象
JPanel jpanel1 = new JPanel();
// 设置对象面板的大小
jpanel1.setPreferredSize(new Dimension(0, 50));
// 实例化一个文本输入框对象
// JTextField jte=new JTextField(20);
jte.setPreferredSize(new Dimension(300, 40));
jte.setEditable(false);
// 添加组件到对象中
jpanel1.add(jte);
return jpanel1;
}
// 创建面板2的方法
public JPanel jp2() {
// 实例化一个JPanel类的对象
JPanel jp2 = new JPanel();
jp2.setLayout(new GridLayout(4, 4));
JButton jb0 = new JButton("0");
JButton jb1 = new JButton("1");
JButton jb2 = new JButton("2");
JButton jb3 = new JButton("3");
JButton jb4 = new JButton("4");
JButton jb5 = new JButton("5");
JButton jb6 = new JButton("6");
JButton jb7 = new JButton("7");
JButton jb8 = new JButton("8");
JButton jb9 = new JButton("9");
JButton jb10 = new JButton("+");
JButton jb11 = new JButton("-");
JButton jb12 = new JButton("*");
JButton jb13 = new JButton("/");
JButton jb14 = new JButton(".");
JButton jb15 = new JButton("=");
jp2.add(jb7);
jp2.add(jb8);
jp2.add(jb9);
jp2.add(jb13);
jp2.add(jb4);
jp2.add(jb5);
jp2.add(jb6);
jp2.add(jb12);
jp2.add(jb1);
jp2.add(jb2);
jp2.add(jb3);
jp2.add(jb11);
jp2.add(jb0);
jp2.add(jb14);
jp2.add(jb10);
jp2.add(jb15);
jb1.addActionListener(co);
jb2.addActionListener(co);
jb3.addActionListener(co);
jb4.addActionListener(co);
jb5.addActionListener(co);
jb6.addActionListener(co);
jb7.addActionListener(co);
jb8.addActionListener(co);
jb9.addActionListener(co);
jb10.addActionListener(co);
jb0.addActionListener(co);
jb11.addActionListener(co);
jb12.addActionListener(co);
jb13.addActionListener(co);
jb14.addActionListener(co);
jb15.addActionListener(co);
return jp2;
}
}
package lesson7;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
/**
*
* @author pengyun
*
*/
public class CounterListener implements ActionListener{
private JFrame jf;
private JTextField jte;
private String sr,sb;
public CounterListener(JFrame jf,JTextField jte){
this.jf=jf;
this.jte = jte;
}
@Override
public void actionPerformed(ActionEvent e) {
sr = e.getActionCommand();
sb = jte.getText();
if(sr=="=") {
if(sb.contains("+")) {
String a=sb.substring(0, sb.indexOf("+"));
String b=sb.substring(sb.indexOf("+")+1);
int c=Integer.parseInt(a);
int d=Integer.parseInt(b);
int f=c+d;
String s=f+"";
jte.setText(s);
}
if(sb.contains("-")) {
String a=sb.substring(0, sb.indexOf("-"));
String b=sb.substring(sb.indexOf("-")+1);
int c=Integer.parseInt(a);
int d=Integer.parseInt(b);
int f=c-d;
String s=f+"";
jte.setText(s);
}
if(sb.contains("*")) {
String a=sb.substring(0, sb.indexOf("*"));
String b=sb.substring(sb.indexOf("*")+1);
int c=Integer.parseInt(a);
int d=Integer.parseInt(b);
int f=c*d;
String s=f+"";
jte.setText(s);
}
if(sb.contains("/")) {
String a=sb.substring(0, sb.indexOf("/"));
String b=sb.substring(sb.indexOf("/")+1);
int c=Integer.parseInt(a);
int d=Integer.parseInt(b);
double f=c/d;
String s=f+"";
jte.setText(s);
}
}
else if((sr=="0")||(sr=="1")||(sr=="2")||(sr=="3")||(sr=="4")||(sr=="5")||(sr=="6")||(sr=="7")||(sr=="8")||(sr=="9")||(sr=="+")||(sr=="-")||(sr=="*")||(sr=="/")){
sb = jte.getText()+sr;
jte.setText(sb);
}
}
}