接口与画图板的实现

  • 前言
  • 接口
  • 事件与监听
  • 接口格式及使用方法
  • 简单实现按钮的监听
  • 画图板的实现
  • 工具
  • 实现
  • 扩展一下


前言

接口是前天学习的, 但一直拖到今天才写,在构想思路的时候总感觉遗漏了什么,当时还是有不少启发的,但现在有的记不起来了(哎,记忆最好的时候还属高中啊),没办法,只能尽我所能了写了,以后学习到一个新的知识点之后,一定要当天或者第二天把它写出来,不要让它在你脑子过两夜。。。

接口

接口听起来挺熟悉的,我们电脑就有很多接口,那么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;

看下效果:

java挡板是什么意思 java接口挡板_java


点击登录按钮

java挡板是什么意思 java接口挡板_Math_02

画图板的实现

工具

  • 首先需要一个窗体作为画图的面板
  • 图形类的绘制工具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) {
    }
}

主程序和之前的界面开发差不多,界面内容如下:

java挡板是什么意思 java接口挡板_Math_03


可视化.setVisible 之后:

创建画笔:

Graphics Gp = 窗体对象.getGraphics()

创建实现接口类对象

DrawListener ML = new DrawListener();

为鼠标和按钮添加相应监听器

Jf.addMouseListener(ML);
line.addActionListener(ML);
Rect.addActionListener(ML);
over.addActionListener(ML);

最后一定要把画笔传入接口中

ML.Gp = Gp;

试一下

java挡板是什么意思 java接口挡板_Math_04

扩展一下

如果我们想画别的形状的图形,但是画笔里有没有这个函数怎么办呢,比如三角形。查看矩形函数的源代码,在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);
        }
    }

运用这个函数最后画出三角形:

java挡板是什么意思 java接口挡板_java_05