一:知识点:
一:图形界面:AWT
(1)java提供的图形界面类
- AWT(基础)
- AWT的组件是由操作系统的绘图机制绘制的出来的;
- AWT的组件是在java.awt包下的。
- SWING(扩展)
- SWING的组件实在javax,swing包下的;
- SWING的组件是基于AWT组件的基础上重构的新的组件。
(2)常用的组件类
- 容器组件:能添加容器组件或者元素组件的就是容器组件类
JFrame | 窗体容器组件类 | 顶级容器 |
元素组件:一般用来显示文字,图片,接受输入的组件就是元素组件类.
JLabel |
标签元素组件类 | 用来显示图片,问题的组件类 |
JTextField | 文本输入框组件类 | 用来接受输入的信息,直接显示出来 |
JPasswordField | 密码输入框组件类 | 用来接收输入的信息,但是是以某个符号代替显示 |
JCheckBox | 复选框元素组件类 | 有一个选择框,还能显示文字或图片 |
JButton | 按钮元素组件类 | 用来显示图片或者文字,还能点击 |
- 辅助类:帮助组件完成某一个功能的类。
- FlowLayout 流式布局类 类似于word档。
- Dimension 封装宽度和高度的类
- ImageIcon 图标类 加载一个图片文件到程序中
- 上述的1-2中提供的类是javax.swing包的类。 在写的时候必须要加上包名。
- FlowLayout和Dimension是在java.awt包下
- ImageIcon是在javax.swing包下。
3.实现一个登录界面的步骤
- 新建一个Login.java的类,然后在类中定义主函数和初始化界面的方法。
- 在主函数中,实例化Login类的对象,调用初始化界面的方法。
- 实例化一个JFrame顶级容器窗体对象,设置窗体对象的属性值:大小,标题,显示位置,布局,关闭,可见
- 创建组件类的对象,将组件添加到窗体上。
二.接口:
(1)接口(格式)
- 接口的定义
- 定义接口的关键字:interface
- 格式:
- public interface 接口名 extends 接口,... {
- //定义常量(常量名必须全部大写)
- public static final 数据类型 常量名 = 值;
- //定义抽象方法
- public abstract 返回值类型 方法名(数据类型 参数名,...);}
注意:
1.接口只有一个访问修饰符public。
2.接口会默认提供的关键字有:public、static、final、abstract
3.接口不能实例化对象。
2.类实现接口(类继承了接口)
类的继承是单继承,有了接口,就可以让类继承多个接口(丰富类的继承)。
实现接口的关键字:implements
实现接口的格式:
public class 类名 extends 类名 implements 接口名,... {
//必须要实现接口中所有的抽象方法(接口的父接口中的方法也必须要实现)
}
注意:子类必须要实现接口中所有的抽象方法。
3.注意接口和类的区别
2.事件机制(重点)
1.事件源对象
1.有哪些内容可以成为事件源对象?
所有的组件都可以成为事件源对象。
2.在界面上你如何确定谁是事件源对象呢?
你在哪一个组件上发生动作,那么这个组件就是你的事件源对象。
2.事件监听方法
addActionListener(ActionListener l);
动作监听方法,该方法主要用来监听是否在类似按钮事件源对象上发生鼠标点击动作或者
在类似输入框事件源对象上发生键盘的回车动作;如果监听到动作后,就会交给参数
ActionListener的事件处理类的对象进行处理,对象就会自动调用事件处理方法。
addMouseListener(MouseListener l);
鼠标监听方法,该方法主要用来监听事件源对象上是否有鼠标按下、释放、单击、进入
和离开动作;如果监听到动作后,就会交给参数MouseListener的事件处理类的
对象进行处理,对象就会自动调用事件处理方法。
addMouseMotionListener(MouseMotionListener l);
鼠标移动监听方法,该方法主要用来监听事件源对象上是否有鼠标移动或者拖动动作;
如果监听到动作后,就会交给参数MouseMotionListener的事件处理类的对
象进行处理,对象就会自动调用事件处理方法。
addKeyListener(KeyListener l);
键盘监听方法,该方法主要用来监听事件源对象上是否有键盘按键按下,释放和敲击动作;
如果监听到动作后,就会交给参数KeyListener的事件处理类的对
象进行处理,对象就会自动调用事件处理方法。
三.事件接口(事件处理类)
ActionListener 动作事件接口
MouseListener 鼠标事件接口
MouseMotionListener 鼠标移动事件接口
KeyListener 键盘事件接口
接口是否能实例化对象呢?不可以
定义事件处理类实现事件接口
4.事件执行流程
目标:点击登录界面上的登录按钮,就要显示一个新的界面。
1.事件源对象:登录按钮
2.事件监听方法:addActionListener(ActionListener l);
3.事件接口(事件处理类):ActionListener
开发步骤:
1.定义LoginListener事件处理类,该类实现ActionListener动作事件接口,实现接口中的抽象方法。
2.在事件处理方法(实现的抽象方法)中,显示一个新的界面
3.在界面类中,实例化LoginListener事件处理类的对象ll.
4.改事件源butLogin添加动作监听方法,指定事件处理类的对象ll.
登录成功后,登录界面就不需要再显示了。
事件处理类中没有登录界面窗体对象,所需你需要定义方法向登录界面类去借窗体对象。
二:实现一个登录界面
1.新建一个Login.java的类,然后在类中定义主函数和初始化界面的方法。
2.在主函数中,实例化Login类的对象,调用初始化界面的方法。
3.实例化一个JFrame顶级容器窗体对象,设置窗体对象的属性值:大小,标题,显示位置,布局,关闭,可见
4.创建组件类的对象,将组件添加到窗体上。
代码:login.java包
import java.awt.Dimension; public class login { //1.程序的入口主函数 public static void main(String[] args){ //在主函数中,实例化login类的对象,调用初始化界面的方法。 login l=new login(); l.initUT(); } //1.设置登入界面的方法。 public void initUT(){ //public 返回值类型 方法名(数据类型 参数名){} //实例化一个JFrame顶级容器船体对象 javax.swing.JFrame jf=new javax.swing.JFrame(); jf.setSize(300,470);//设置的大小。单位是像素 jf.setResizable(false);//设置为不可以调整大小。 jf.setTitle("login");//设置窗体的标题。 jf.setLocationRelativeTo(null);//设置窗体的显示的位置,null表示在中央 jf.setDefaultCloseOperation(3);//设置关闭窗口时,3关闭窗口退出程序 //实例化一个流失布局类的对象,布局类是针对容器的,容器上要填多个组件,那么必须要设置排列对齐方式 java.awt.FlowLayout fl=new java.awt.FlowLayout(); jf.setLayout(fl);//设置窗体的布局方式为流式布局 //定义一个ImageIcon类,该类用来读取一个磁盘的图片文文件。 javax.swing.ImageIcon image=new javax.swing.ImageIcon("E:\hesi\LoginDemo\bin\s.png"); //创建一个JLable类的对象,用来显示加载的图片 javax.swing.JLabel labelImage=new javax.swing.JLabel(image);// jf.add(labelImage); //将LabelImage添加到窗体上 //实例化一个JTextField类的对象 javax.swing.JTextField textName=new javax.swing.JTextField(); Dimension dim= new java.awt.Dimension(200,30); //实例化一个封装组件高度和高度 textName.setPreferredSize( dim);//將textName添加在窗体上 jf.add(textName); javax.swing.JLabel labelShopping=new javax.swing.JLabel("注册登入"); jf.add(labelShopping); javax.swing.JPasswordField Passwordname=new javax.swing.JPasswordField(); java.awt.Dimension dis= new java.awt.Dimension(200,30); Passwordname.setPreferredSize(dis); jf.add(Passwordname); javax.swing.JLabel labelPassword=new javax.swing.JLabel("登入密码"); jf.add(labelPassword); javax.swing.JCheckBox cbl=new javax.swing.JCheckBox("记住密码 "); java.awt.Dimension dic=new java.awt.Dimension(130,30); cbl.setPreferredSize(dic); jf.add(cbl); javax.swing.JCheckBox cba=new javax.swing.JCheckBox("找回密码 "); java.awt.Dimension dib=new java.awt.Dimension(130,30); cba.setPreferredSize(dib); jf.add(cba); javax.swing.JButton cbc=new javax.swing.JButton("登入 "); java.awt.Dimension div=new java.awt.Dimension(200,30); cbc.setPreferredSize(div); jf.add(cbc); jf.setVisible(true);//设置窗体可见 login2 ll=new login2(); cbc.addActionListener(ll);//添加监听方法。 ll.setloginFrame(jf); ll.setText(textName); ll.setEchoChar(Passwordname); } }
login2.java包
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JPasswordField; import javax.swing.JTextField; //ctrl+shift+o,自动生成。 // public class login2 implements ActionListener { //ActionListener系统自带的接口 /** * 用一个函数来把login的窗口以及值传过来。 */ public JFrame login;//public 数据类型 属性名; public JTextField textName; public JPasswordField Passwordname; public void setloginFrame(JFrame l) { login = l; }//public 返回值类型 方法名(数据类型 参数名){} public void setText(JTextField s) { textName = s; } public void setEchoChar(JPasswordField v) { Passwordname = v; } public void actionPerformed(ActionEvent e) { String t = textName.getText(); String str = new String(Passwordname.getPassword()); if (t.equals("hesi") && str.equals("123")) { //参数名.equals相当于==。 JFrame frame = new JFrame(); frame.setTitle("画图"); frame.setSize(600, 500); frame.setDefaultCloseOperation(3); frame.setLocationRelativeTo(null); frame.setVisible(true); login.dispose();//关闭登入界面。 } else { JFrame frame = new JFrame(); frame.setTitle("错误提示"); frame.setSize(200, 100); frame.setDefaultCloseOperation(3); frame.setLocationRelativeTo(null); frame.setVisible(true); } } }
结果:
密码正确时:
密码不正确时
一注意点:
1.明确事件源。
2.理清逻辑,确保逻辑清晰后再写。
3.方法名的书写。