在Java编程中,可以使用类的继承来简洁的完成拥有定义相同属性、相似方法类的操作。但是类的继承面临一个问题,一个子类无法继承自多个父类,所以引入接口概念。
1.接口:
定义接口的关键字:interface
定义一个接口的格式:
public interface 接口名 extends 父类 implements 接口名,...{
public static final 数据类型 常量名 = 值; //定义常量 Java语言的命名规则是常量名的每一个字母都要大写(不是强制要求)
public abstract 返回值类型 抽象方法名(数据类型 参数名,...); //定义抽象方法
}
由上可见,一个接口可以继承一个父类,可以实现(implements)多个接口。接口有且只包含全局常量和抽象方法的定义。
全局常量:以 访问修饰符 static final 数据类型 常量名 = 值; 的形式定义。规范的常量名每个字母都是大写。
抽象方法:以 访问修饰符 abstract 返回值类型 抽象方法名(数据类型 参数名,...); 的形式定义。注意与普通方法的区别为(1)有abstract关键字声明(2)没有大括号(3)没有具体方法体。
关于接口需要注意:
(1)接口不能实例化对象。
(2)接口只有一个访问修饰符public。
(3)接口默认提供public、static、final、abstract关键字
例如在Shape接口中:
interface Shape extends ActionListener {//省略public
String NAME = "张三";//定义常量省略public static final
void draw();//定义抽象方法省略 public abstract
}
在Manager类的主函数中:
Shape sh = new Shape();
会报错,因为接口不能直接实例化对象。
所以接口中的内容想要实现就必须要使用类来实现:
实现接口的关键字:implements
格式:
public class 类名 extends 类名 implements 接口名,... {
}
注意定义的类中必须要实现接口中所有的抽象方法。例如A接口实现了B接口,定义的类实现了A接口,类中就必须实现A、B接口中所有的抽象方法。
Java编程中,如果需要实现新的界面程序就必须使用Java的图形界面操作。
2.图形界面
首先,Java中存在大量的图形界面源代码根据它们所储存的包名称不同,大体可以分为:
(1)AWT组件(因为这些类是位于java.awt包下)
AWT组件是依赖于操作系统的绘图机制实现的,这样不同平台上就需要不同的一套代码实现(Java语言实现的)。AWT组件称之为重量级组件。
(2)SWING组件(因为这些类是位于javax.swing包下。)
SWING组件是基于AWT的基础上,采用纯Java代码重新构建一套新的轻量级组件。
SWING组件中的顶级容器还是属于重量级组件,因为其他的组件都要依赖于这个顶级容器来实现(绘制)。
例如JFrame、JWindow、JApplet组件等。
组件根据作用不同可以分为:
(1)容器组件类:能添加容器组件或者元素组件的就是容器组件类。
例如,JFrame与JPanel都是容器组件:
JFrame | 窗体容器组件类 | 顶级容器 |
JPanel | 面板容器组件类 | 最灵活的容器 |
(2)元素组件类:一般只会用来显示文字图片接收用户的输入。
例如几个常用的元素组件类:
JLabel | 标签元素组件类 | 显示文字或者图片 |
JTextField | 文本输入框元素组件类 | 接收输入的信息,并且直接显示出来。 |
JPasswordField | 密码输入框元素组件类 | 接收输入的信息,以某一个符号代替显示。 |
JCheckBox | 复选框元素组件类 | 提供一个可以选择的框,在框后边还能显示文字或者图片。 |
JButton | 按钮元素组件类 | 显示文字或者图片,有点击效果。 |
上述的容器组件和元素组件类都是SWING组件类,所以你在使用的时候要记得加上包名:javax.swing.JFrame。
如果要使用AWT的组件,那么类名要必SWING组件的类名少一个字母J,例如:java.awt.Frame。
AWT组件中不存在密码输入框元素组件类。
引入组件类时可以将包名属于在程序的最上端,也可以光标选择组件类后,按住Ctrl+Shift+O自动引入包名。
(3)辅助类:帮助组件去完成某一个功能的类。
常用的几个辅助类:
FlowLayout | 流式布局类 | 类似于我们使用的word文档,可以设置组件对齐方式(左、右、居中),这个布局方式不可以手动换行,只能根据添加的组件来自动换行 |
Dimension | 封装类 | 用来存储组件的宽度和高度,它也是AWT中的类。 |
ImageIcon | 图标类 | 将磁盘上的图片文件加载到程序中,这样组件就可以直接去显示这个图标对象了。 |
流式布局是java.awt包下的类,使用的时候要加包名:java.awt.FlowLayout
ImageIcon是javax.swing包下的类,使用的时候要加上包名:javax.swing.ImageIcon
举实现一个登录界面的例子来使用上述的知识:
具体实现步骤:
1.定义Login类,在类中定义主函数和初始化界面的方法。
public class Login {
public static void main(String[] args) {
public void initUI() {
}
}
}
2.在主函数中,实例化Login类的对象,然后调用初始化界面的方法。
……
public static void main(String[] args) {
Login login = new Login();
login.initUI();
}
……
3.在初始化界面的方法中,实例化JFrame顶级容器组件类的对象。
……
public void initUI() {
JFrame frame = new JFrame();
…….
}
4.设置窗体的属性值:标题、大小、显示位置、关闭操作、是否可调整大小、布局、可见、...
public void initUI() {
……
frame.setTitle("Login");// 设置窗体的标题
frame.setSize(300, 400);// 设置窗体的大小,单位是像素
frame.setLocation(100, 100);//设置窗体显示的位置,第一个参数是x坐标,第二个参数是y坐标
frame.setLocationRelativeTo(null);// 设置窗体相对于另一个组件的中间位置,参数为null表示在屏幕的中央
frame.setDefaultCloseOperation(3);// 设置关闭窗体时的操作,3表示关闭所有窗体退出程序
frame.setResizable(false);// 设置禁止调整窗体的大小
……
frame.setVisible(true);// 设置窗体为可见
5.实例化组件类的对象,然后将组件对象添加到窗体上,这一步必须要写在窗体可见之前。
…
ImageIcon image = new ImageIcon("src/xxj/login0714/login.png");// 实例化ImageIcon类的对象,用来加载login.png图片
JLabel labImage = new JLabel(image); // 实例化JLabel类的对象,用来显示image图标对象
frame.add(labImage); // 将labImage标签对象添加到顶级容器窗体上
JLabel labName = new JLabel("账号:");// 实例化JLabel类的对象,用来显示文字"账号:"
frame.add(labName); // 将labName标签对象添加到顶级容器窗体上
JTextField textName = new JTextField();//实例化JTextField类的对象
textName.setPreferredSize(new Dimension(230,30)); //设置输入框的首选大小,参数必须是Dimension类的对象,这个对象是封装组件的宽度和高度
frame.add(textName);// 将textName文本框对象添加到顶级容器窗体上
……
frame.setVisible(true);// 设置窗体为可见
注意:所有图形界面的类在使用前必须引用到你所用来实现的类中。
3.事件机制
Java中可以使用事件的监听来实现各种操作,但首先要明白完成该操作时会涉及到哪些事件源对象。事件源对象可以由容器组件和元素组件构成。Java中动作发生在哪个组件上,该组件就是事件源对象。
事件的监听方法:
该方法的作用就是监听事件源对象上是否有对应的动作发生,如果有动作发生,则收集相关的信息,交给事件接口的对象进行处理。
事件接口:
事件接口就是收集到监听方法传递信息后实现的处理操作。
举一个在Swing界面中用到的例子,不同的是该例子实现按住登录按钮后还可以弹出一个窗口的例子来说明Java中的事件机制。
事件源对象:登录按钮
事件监听方法:addActionListener(ActionListener l);//捕获类似按钮组件上的鼠标点击动作和类似输入框组件上回车动作。
接口是不能实例化对象,所以需要定义类(事件处理类)实现接口
事件接口:ActionListener
实现步骤:
(1)新建一个LoginListener事件处理类,该类通过implement关键字实现ActionListener动作事件接口,实现接口中全部的抽象方法。
public class LoginListener implements ActionListener {
public LoginListener(JFrame login){//重写抽象方法
this.login = login;
}
}
(2)新建一个叫做actionPerformed的事件处理方法,在其中实例化一个JFrame窗体容器组件类的对象,设置窗体的属性值。
public void actionPerformed(ActionEvent e){
JFrame f = new JFrame();//实例化JFrame对象f
f.setDefaultCloseOperation(3);//设置窗体的关闭属性
f.setLocationRelativeTo(null);//设置窗体的出现位置
f.setTitle("画图");//设置窗体名称
f.setSize(600, 400);//设置窗体大小
f.setVisible(true);//设置窗体可视性
}
(3)新建一个界面类在界面类中,实例化LoginListener事件处理类的对象,取对象名ll。
public class Login {
……
LoginListener ll = new LoginListener();
}
(4)给butLogin事件源对象,addActionListener()添加动作监听方法,指定事件处理类的对象名ll。
butLogin.addActionListener(ll);
至此,该例子可以实现按住登录按钮后弹出一个名叫画图的新窗口。