接口与画图板的实现
- 前言
- 接口
- 事件与监听
- 接口格式及使用方法
- 简单实现按钮的监听
- 画图板的实现
- 工具
- 实现
- 扩展一下
前言
接口是前天学习的, 但一直拖到今天才写,在构想思路的时候总感觉遗漏了什么,当时还是有不少启发的,但现在有的记不起来了(哎,记忆最好的时候还属高中啊),没办法,只能尽我所能了写了,以后学习到一个新的知识点之后,一定要当天或者第二天把它写出来,不要让它在你脑子过两夜。。。
接口
接口听起来挺熟悉的,我们电脑就有很多接口,那么java中的接口有什么用呢,既然都叫接口,肯定有异曲同工之处,电脑的接口外接很多设备,相当于扩展电脑的功能,在我的理解中,java接口也一样,可以扩展更多的操作,不过Java接口类似于中断,触发中断去完成其它的一些操作,虽然严格的探究这样相比并不合适,但帮助理解还是很好用的。接下来说两个概念:
事件与监听
事件
就界面开发而言,界面上的一个操作就叫一个事件。比如我按了界面上的一个按钮,点击了一下鼠标。那么程序怎么知道我进行了上述操作了呢,就要用到监听了。
监听
不同的操作有不同的监听器,这是可以监听按钮的的动作监听器:ActionListener
,需要为按钮添加监听按钮对象.addActionListener()
这是鼠标监听器MouseListener
,为窗体添加鼠标监听器窗体对象.addMouseListener()
接口格式及使用方法
接口格式
查看动作监听器的源代码:
public interface ActionListener extends EventListener {
/**
* Invoked when an action occurs.
*/
public void actionPerformed(ActionEvent e);
}
它是一个interface(接口),同时继承了它的父接口,里面有一个抽象方法,参数类型为ActionEvent
类,没有方法体。所以接口的格式为:
public interface 接口名{
//接口中的方法可以写成没有方法体的格式 -- 抽象方法
//接口中不能定义变量
}
使用方法
我们知道,要使用类中方法的时候,要先创建对象,然后通过对象才能使用类中的方法,接口也可以作为一种类型存在,像这样写是不会报错的:
接口 mi = new 类();
然而接口是不可以创建对象的,那怎么办呢,是的,要借助类了,创建一个类实现接口
关键字 implements
public class 类名 implements 接口{
//1、实现了接口的类,必须重写接口的抽象方法为实体方法
//2、这个类的对象,可以自动转型为接口的类型
//3、这个类可以直接使用接口的常量
}
其中第一点,实现了接口的类,必须重写接口的抽象方法为实体方法,其实接口中的抽象方法就像是一部新手机,商家不知道用户的喜好所以所以没有去设置手机,用户拿到手机后就得自己去设置之后才能正常的使用。
继承是单继承,接口时多实现
继承时子类只能同时继承一个父类,而一个类可以同时实现多个接口,这在后面画图板的实现时会用到。
简单实现按钮的监听
按钮的监听是在之前界面开发的基础上的,输入用户和密码,按下登录按钮,判断是否正确。
先用一个类去实现动作监听器ActionListener
:
package com.wj0905.Interface;
import java.awt.event.ActionEvent; //动作事件类
import java.awt.event.ActionListener; //动作监听器
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Iminterface implements ActionListener {
JTextField nameField=null;
JPasswordField pwdField=null;
// 重写方法
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了");
String name = nameField.getText();// 从输入框对象中获取文本
String pass = pwdField.getText();
// 判断 有数据库的话,在数据库里查找对比
if (name.equals("Wenjin")&&pass.equals("123456789")){
show("登陆成功");
}
else {
show("登陆失败");
}
}
public void show(String txt) {
JFrame ts = new JFrame(txt);
ts.setSize(300,100);
ts.setLocationRelativeTo(null);
ts.setVisible(true);
}
}
接口是实现了,会发现少些东西,上面实现过程中:
JTextField nameField=null;
JPasswordField pwdField=null;
这两个常量是空的,我们要回到住程序中,在窗体可视化之后:
创建实现接口类对象
Iminterface It = new Iminterface();
为按钮添加动作监听
jbt.addActionListener(It);
把两个输入框传到上面创建的类中,好好想想这一步有利于理解整个实现接口框架
It.nameField= namefield;
It.pwdField=passfield;
看下效果:
点击登录按钮
画图板的实现
工具
- 首先需要一个窗体作为画图的面板
- 图形类的绘制工具
Graphics
、窗体的一个属性.getGraphics()
–画笔 - 鼠标监听器
MouseListener
,动作监听器ActionListener
-
MouseEvent
鼠标事件,获得鼠标点击按钮上的信息 - 绘图方法,将画笔传入监听器中,调用方法画图
实现
首先用一个类去实现鼠标监听器和动作监听器,在里面重写各种方法。
package com.wj0906.DrawPad;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Graphics;
public class DrawListener implements MouseListener,ActionListener {
int x1,y1,x2,y2; //鼠标按下和释放的坐标
Graphics Gp=null; // 画笔工具
String btnstr; 按钮字符串
//重写按钮动作监听方法
public void actionPerformed(ActionEvent e) {
btnstr = e.getActionCommand(); // 获取按钮上的字符串
}
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击了");
}
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下了");
获取坐标
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标放开了");
x2 = e.getX();
y2 = e.getY();
//根据鼠标点下的按钮上的字符串判断调用哪个绘图方法
if(btnstr.equals("直线")){
Gp.drawLine(x1, y1, x2, y2);
}else if(btnstr.equals("矩形")) {
Gp.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));
}else if(btnstr.equals("圆")) {
Gp.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));
}
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
主程序和之前的界面开发差不多,界面内容如下:
在可视化.setVisible
之后:
创建画笔:
Graphics Gp = 窗体对象.getGraphics()
创建实现接口类对象
DrawListener ML = new DrawListener();
为鼠标和按钮添加相应监听器
Jf.addMouseListener(ML);
line.addActionListener(ML);
Rect.addActionListener(ML);
over.addActionListener(ML);
最后一定要把画笔传入接口中
ML.Gp = Gp;
试一下
扩展一下
如果我们想画别的形状的图形,但是画笔里有没有这个函数怎么办呢,比如三角形。查看矩形函数的源代码,在Graphics
这个类里。
public void drawRect(int x, int y, int width, int height) {
if ((width < 0) || (height < 0)) {
return;
}
if (height == 0 || width == 0) {
drawLine(x, y, x + width, y + height);
} else {
drawLine(x, y, x + width - 1, y);
drawLine(x + width, y, x + width, y + height - 1);
drawLine(x + width, y + height, x + 1, y + height);
drawLine(x, y + height, x, y + 1);
}
}
可以看到也是用基础的直线画出来的,我们按这个思路也可以画一个三角形,注意交叉的地方像素不能重合,代码如下:
public void Triangle(int x, int y, int width, int height) {
if ((width < 0) || (height < 0)) {
return;
}
if (height == 0 || width == 0) {
Gp.drawLine(x, y, x + width, y + height);
} else {
Gp.drawLine(x, y, x + width-1, y + height - 1);
Gp.drawLine(x + width, y + height, x + 1, y + height);
Gp.drawLine(x, y + height, x, y+1);
}
}
运用这个函数最后画出三角形: