一、Swing界面开发
(1)Java有两种图形界面类:AWT组件和SWING组件。在Java中,GUI操作的支持API,一般保存在java.awt和javaw.swing包中。
1.AWT组件(基础)
AWT组件的名字是由包名而来的,它的包名是:java.awt;AWT组件是jdk1.0就推出的图形界面组件类。
AWT组件是属于重量级组件,重量级组件表示的是组件的实现依赖于操作系统底层的绘图机制(所有组件实现都是调用系统底层的绘图函数实现的)。
同一个组件在不同的平台上,那么都需要重新编写代码(Java语言开发者的角度)。
2.SWING组件(扩展)
SWING组件的包名是:javax.swing;SWING组件是jdk1.4的时候推出的图形界面类。其中x是扩展的意思。
SWING组件是轻量级组件,它是基于AWT的基础上采用纯Java代码构建一套新的轻量级组件,保证同一个组件在不同的平台上工作方式一致。
SWING组件中的顶级容器是重量级组件,因为其它的组件要依赖于顶级容器来实现。
(2)常见的组件类分为3种:容器组件类、元素组件类、辅助类。
1.容器组件类:能添加容器组件或者元素组件的就是容器组件类。
JFrame 窗体容器组件类 顶级容器
2.元素组件类:一般只用来显示文字、图片或者接受输入的就是元素组件类。
JLabel 标签元素组件类 用来显示文字或者图片
JTextField 文本输入框元素组件类 接收用户的输入,直接显示出来。
JPasswordField 密码输入框元素组件类 接收用户的输入,以某一个符号代替显示。
JCheckBox 复选框元素组件类 提供一个选择框,还能显示文字或者图片。
JButton 按钮元素组件类 用来显示文字或者图片,但是还有点击效果。
注:
上述的容器组件和元素组件类都是SWING组件,所以你在使用的时候要记得加上包名:javax.swing.JFrame、javax.swing.JLabel、...
如果想要使用AWT组件的类,AWT组件的类名比SWING组件的类名少一个字母J,使用格式:java.awt.Frame、java.awt.Label、...
在AWT组件中不存在PasswordField组件。
3.辅助类:帮助容器组件或者元素组件完成某一功能的类。
java.awt.FlowLayout 流式布局类 流式布局设置组件是左对齐、右对齐或居中对齐,还可以设置组件与组件之间的间距,但是流式布局如果要换行必须是这一行放不下才会自动换到下一行。
java.awt.Dimension 封装类 设置组件大小,那么就可以使用Dimension先来封装组件的宽度和高度,然后再设置给组件。
javax.swing.ImageIcon 图标类 加载磁盘上的图片文件到程序中。
(3)具体实现操作
1.窗体
javax.swing.JFrame frame = new javax.swing.JFrame();//实例化窗体
frame.setTitle("Login");//窗体题目
frame.setSize(300, 400);//窗体大小
frame.setLocationRelativeTo(null);//窗体位置
frame.setDefaultCloseOperation(3);//关闭窗体退出程序
frame.setResizable(false);//禁止调整窗口大小
frame.setVisible(true);//将窗体设为可见
2.标签
javax.swing.JLabel Labname1 = new javax.swing.JLabel("文字内容");
frame.add(Labname1);
3.文本框
javax.swing.JTextField text1 = newjavax.swing.JTextField();
text1.setPreferredSize(new java.awt.Dimension(240, 30));
frame.add(text1);
4.密码框
javax.swing.JPasswordField text2 = newjavax.swing.JPasswordField();
text2.setPreferredSize(new java.awt.Dimension(240,30));
frame.add(text2);
5.按钮
javax.swing.JButton button = new javax.swing.JButton(" 按钮名");
frame.add(button);
6.复选框
javax.swing.JCheckBox box1 = new javax.swing.JCheckBox("复选框名");
panel1.add(box1);
7.添加图片
javax.swing.ImageIcon image = new javax.swing.ImageIcon("图片路径");//导入图片
javax.swing.JLabel Labimage = new javax.swing.JLabel(image);
frame.add(Labimage);
8.布局格式
java.awt.FlowLayout f1 = new java.awt.FlowLayout();
frame.setLayout(f1);//流式布局
java.awt.BorderLayout b1 = new java.awt.BorderLayout();
frame.setLayout(b1); //分隔式布局
二、接口和事件机制
(1)接口
接口是用来丰富类的继承关系。接口的实现本质上就是继承。
定义接口的关键字为interface,格式如下:
public interface 接口名 extends 接口,... {
//定义常量
public static final 数据类型 常量名 = 值;
//定义抽象方法
public abstract 返回值类型 方法名(数据类型 参数名,...);
}
实现接口的关键字:implements,格式如下:
public class 类名 extends 类名 implements 接口,... {
//类必须要实现接口中所有的抽象方法。
}
接口和类的区别如下:
1.接口只能继承一个接口,而类可以继承一个类并实现多个接口。
2.接口中只含有抽象函数和常量,而类中还可以含有其他方法。
3.接口中只有一个访问修饰符public,而类中有四个访问修饰符。
4.接口不允许实例化对象,而类可以实例化对象。
5.接口中Java中默认提供public、static、final、abstract关键字,而类没有。
(2)事件机制
事件源对象的定义:所有的组件都可以成为事件源对象。你的动作发生在哪一个组件上,那么该组件就是事件源对象。
事件监听方法为:addActionListener(ActionListener l);
动作监听方法,主要是监听类似按钮组件上的鼠标点击动作和类似输入框组件上的键盘回车动作。
如果在事件源上有动作发生,那么addActionListener监听方法就会捕获这个动作,然后将动作交给ActionListener类型的参数对象进行处理,对象就会自动的去调用对应的事件处理方法,执行方法中的代码。
一般情况下,ActionEvent适合于对某些控件的单击(也有特殊情况)。常见发出ActionEvent的场合如下:
1.JButton、JComboBox、JMenu、JMenuItem、JCheckBox、JRadioButton等控件的单击。
2.javax.swing.Timer发出的事件。
3.在JTextField等控件上按Enter键、JButton等控件上按空格键(相当于单击效果)等。
事件接口的定义: ActionListener就是动作事件接口,它是发生动作后,最终要执行什么样操作的接口(类)。
目标:点击登录界面上的登录按钮,显示一个新界面。
事件机制
事件源对象:登录按钮
事件源方法:addActionListener(ActionListener l);
事件接口:ActionListener动作事件接口,接口不能实例化对象,所以定义类实现这个接口,实现接口中的抽象方法
实现步骤:
1.定义一个LoginListener事件处理类,该类实现ActionListener动作事件接口,实现(重写)接口中的抽象方法。
2.在事件处理方法(重写实现的方法)中显示一个新的图形界面.
3.在登录界面中,实例化LoginListener事件处理类的对象,对象名ll.
4.在登录界面中,给事件源添加addActionListener()动作监听方法,指定事件处理类的对象ll。
5.可以通过构造方法或者普通方法来将A类中的数据传递到B类中。
代码如下:
Login.java
package xxj.interface0720;
import javax.swing.JButton;
/**
* 1.定义Login类,
*
* @author
*
*/
public class Login {
/**
* 1.在类中定义主函数
*/
public static void main(String[] args) {
// 2.在主函数中,实例化Login类的对象,然后调用初始化界面的方法。
Login login = new Login();
login.initUI();
}
/**
* 1.自定义初始化界面的方法
*/
public void initUI() {
// 3.在初始化界面的方法中,实例化顶级容器JFrame窗体类的对象。
javax.swing.JFrame frame = new javax.swing.JFrame();
// 4.设置窗体容器的属性值:标题、大小、显示位置、关闭操作、布局、禁止调整大小,可见。
frame.setTitle("Login");// 设置窗体的标题
frame.setSize(300, 400);// 设置窗体的大小
// frame.setLocation(300,100);//设置窗体显示的位置
frame.setLocationRelativeTo(null);// 设置窗体相对于另一个组件的位置,参数为null则表示窗体在屏幕的中央
frame.setDefaultCloseOperation(3);// 设置窗体的关闭操作,3表示关闭窗体退出程序。
frame.setResizable(false);// 设置禁止调整窗体的大小
/**
* 实例化FlowLayout流式布局类的对象,
*/
java.awt.FlowLayout fl = new java.awt.FlowLayout();
frame.setLayout(fl);//将窗体的组件对齐方式设置为fl流式布局
// 5.实例化元素组件类的对象,然后将组件类的对象添加到窗体上(在窗体可见之前完成)
// 实例化一个ImageIcon类的对象,用来加载磁盘上的图片文件到程序中
javax.swing.ImageIcon image = new javax.swing.ImageIcon(
"src/xxj/login0716/login.png");
// 实例化一个JLabel类的对象,然后让JLabel显示image图标对象
javax.swing.JLabel labImage = new javax.swing.JLabel(image);
// 将labImage对象添加frame窗体容器上
frame.add(labImage);
// 实例化一个JLabel标签元素组件类,该组件上要显示文字信息"账号:"
javax.swing.JLabel labName = new javax.swing.JLabel("账号:");
// 将labName对象添加frame窗体容器上
frame.add(labName);
//实例化一个JTextField文本输入框元素组件类的对象
javax.swing.JTextField textName = new javax.swing.JTextField();
//设置textName元素组件类的大小
textName.setPreferredSize(new java.awt.Dimension(240,30));
frame.add(textName);
JButton butLogin = new JButton("登录");
frame.add(butLogin);
frame.setVisible(true);// 设置窗体为可见
/**
* 3.在登录界面中,实例化LoginListener事件处理类的对象,对象名ll;将登录界面的窗体对象传递给LoginListener事件处理类对象
*/
LoginListener ll = new LoginListener(frame);
/**
* 4.在登录界面中,给事件源添加addActionListener()动作监听方法,指定事件处理类的对象ll。
*/
butLogin.addActionListener(ll);
}
}
LoginListener.java
package xxj.interface0720;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
/**
* 1.定义一个LoginListener事件处理类,该类实现ActionListener动作事件接口
* @author熊哥
*
*/
public class LoginListener implements ActionListener {
private JFrame login;//声明一个登录界面窗体对象名
/**
* 构造方法
* @param f登录界面的窗体对象
*/
public LoginListener(JFrame f){
login = f;//将登录界面的窗体对象赋给login属性。
}
/**
* 1.实现(重写)接口中的抽象方法。
*/
public void actionPerformed(ActionEvent e){
//2.在事件处理方法(重写实现的方法)中显示一个新的图形界面.
JFrameframe = new JFrame();
frame.setTitle("画图");
frame.setSize(700,600);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//关闭登录界面窗体对象
login.dispose();
}
}