JAVASE学习(15)绘图技术

绘图原理1:

Component类提供了两个和绘图相关最重要的方法:

1)paint(Graphics g)绘制组件的外观

2)repaint()刷新组件的外观

当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件。

绘图原理2:

在以下情况下paint()将会被调用

1)窗口最小化,在最大化

2)窗口的大小发生变化

3)repaint函数被调用

Graphics类

 

/*
 * 功能:Java绘图原理
 * */
package test1;

import javax.swing.*;
import java.awt.*;

public class Demo1 extends JFrame{
	MyPanel mp=null;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Demo1 demo1=new Demo1();
	}
	public Demo1() {
		// TODO Auto-generated constructor stub
		mp=new MyPanel();
		this.add(mp);
		this.setSize(700,500);
		this.setLocation(600, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

}
//定义一个MyPanel(我自己的面板,是用于绘图和现实绘图的区域)
class MyPanel extends JPanel{
	//覆盖JPanel的paint方法
	//Graphics是绘图的重要类,可以理解为一支画笔
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		//1.调用父类函数
		super.paint(g);
		System.out.println("调用paint");
		//先画一个圆
//		g.drawOval(10, 10, 30, 30);
		//画直线
//		g.drawLine(10, 10, 30, 10);
		//画矩形
//		g.drawRect(40, 40, 50, 60);
		//填充矩形
		//设置颜色
//		g.setColor(Color.BLUE);
//		g.fillRect(10, 10, 50, 60);
//		g.setColor(Color.RED);
//		g.fillRect(70, 70, 50, 60);
//		在面板上画出图片
//		Image im=Toolkit.getDefaultToolkit().getImage
//				(Panel.class.getResource("/caocao.jpg"));
//		g.drawImage(im, 90, 90, 200, 150,this);
		//如何画字
//		g.setColor(Color.red);
//		g.setFont(new Font("隶书",Font.BOLD,30));
//		g.drawString("爱我中华", 200, 300);
		
	}
	
	
}



2)事件:

是承载事件源状态改变时的信息对象。事件是事件源向事件监听器传输事件源状态信息的载体。在用户与GUI组件进行交互时就会生成事件,比如当鼠标在面板中移动时,就会生成一个鼠标移动事件的对象,而这个对象保存着当前鼠标在面板中位置信息。java.awt.event包和javax.swing.event包中定义了各种事件类型,常见的事件类有:


3)事件监听器接口

事件源产生一个事件,可以传给事件监听者处理

事件监听者实际上就是一个类,该类实现了某个事件监听器接口,比如MyPanel就是一个类,它实现了ActionListener接口,它就可以作为一个事件监听者,对接受到的事件进行处理。

事件监听器接口有多种,不同的事件监听接口可以监听不同的事件,一个类可以实现一个事件监听接口,也可以实现多个监听接口。ava.awt.event包和javax.swing.event包中定义了各种事件监听接口,常见的事件监听接口有:


/*
 * 功能:事件监听接口实现
 * */

package com.test3;

import javax.swing.*;



import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class Demo4 extends JFrame{
	MyPanel mp=null;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Demo4 demo4=new Demo4();
	}
	public Demo4() {
		// TODO Auto-generated constructor stub
		mp=new MyPanel();
		
		this.add(mp);
		//注册监听
		this.addMouseListener(mp);
		
		this.addKeyListener(mp);
		
		this.addMouseMotionListener(mp);
		this.addWindowListener(mp);
		this.setSize(400,300);
		this.setLocation(600, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
}
/*
 * 1.让MyPanel知道鼠标按下的消息,并且知道点击的位置(x,y)
 * 2.让MyPanel知道哪个键按下
 * 3、让MyPanel知道鼠标移动,拖拽
 * 4、让My知道窗口的变化(关闭、)
 * */
class MyPanel extends JPanel implements MouseListener,KeyListener,MouseMotionListener,WindowListener{
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		
	}
	//1、鼠标点击
	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("鼠标点击了x="+e.getX()+"y="+e.getY());
	}
//2、鼠标移动到MyPanel
	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("鼠标来了");
	}
	//3、鼠标离开MyPanel

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("鼠标离开了");
	}
//4.鼠标按下
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	//5.鼠标释放
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	//键按下
	@Override
	public void keyPressed(KeyEvent e) {
	// TODO Auto-generated method stub
	System.out.println(e.getKeyChar()+"被按下");
	}
	//键松开
	@Override
	public void keyReleased(KeyEvent e) {
	// TODO Auto-generated method stub
	
	}
	//键输入
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
	
	}
	@Override
	public void mouseDragged(MouseEvent e) {
	// TODO Auto-generated method stub
	
	}
	@Override
	public void mouseMoved(MouseEvent e) {
	// TODO Auto-generated method stub
		System.out.println("鼠标当前坐标x="+e.getY());
	}
	//窗口激活
	@Override
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口重新打开");
	}
	//窗口在关闭
	@Override
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口关闭");
	}
//	窗口最小化
	@Override
	public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口正在关闭");
	}
//	窗口最小化
	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口最小化");
		
	}
	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	//窗口打开
	@Override
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口打开");
		
	}
}

总结:事件编程步骤:

1)编写事件处理类(事件监听者)

2)根据需求给事件处理类实现监听器接口

3)在事件处理类重写(实现)其事件处理的函数

4)在事件源类中指定该事件的监听器(响应者)是谁,即注册监听

java事件处理机制:

总结:

1)java采用委托机制处理事件

2)java中的事件是分类的,比如对窗口事件、鼠标事件、按键事件、操作事件【按按钮】

3)java中的一个类要监听某个事件,则必须实现相应的事件监听接口

4)事件监听接口有多种,程序员应当针对不同的情况,实现不同的监听接口,比如监听鼠标事件就应当实现MouseListener;要监听键盘事件,就应当实现KeyListener


/*
 * 功能:加深对事件处理机制的理解
 * 1、通过上下左右键,来控制一个小球的位置
 * */
package com.test2;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Demo3 extends JFrame{
	MyPanel mp=null;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Demo3 demo3=new Demo3();

	}
	public Demo3() {
		// TODO Auto-generated constructor stub
		mp=new MyPanel();
		
		//mp加入到JFrame
	
		this.add(mp);
		this.addKeyListener(mp);
		this.setSize(400,300);
		this.setLocation(600, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
}
//定义自己的panel
class MyPanel extends JPanel implements KeyListener{
	int x=10;
	int y=10;
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		g.fillOval(x, y, 20, 20);
	}
//键被按下
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
	//	System.out.println("键被按下"+(char)e.getKeyCode());
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			y+=3;
		}else if(e.getKeyCode()==KeyEvent.VK_UP){
			y-=3;
		}else if(e.getKeyCode()==KeyEvent.VK_LEFT){
			x-=3;
		}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			x+=3;
		}
		//调用repaint()函数,来重绘界面
		this.repaint();
	}
//键被释放
	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
//键的一个值被输出
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
}
/*
 * 功能:事件监听接口实现
 * */

package com.test3;

import javax.swing.*;



import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class Demo4 extends JFrame{
	MyPanel mp=null;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Demo4 demo4=new Demo4();
	}
	public Demo4() {
		// TODO Auto-generated constructor stub
		mp=new MyPanel();
		
		this.add(mp);
		//注册监听
		this.addMouseListener(mp);
		
		this.addKeyListener(mp);
		
		this.addMouseMotionListener(mp);
		this.addWindowListener(mp);
		this.setSize(400,300);
		this.setLocation(600, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
}
/*
 * 1.让MyPanel知道鼠标按下的消息,并且知道点击的位置(x,y)
 * 2.让MyPanel知道哪个键按下
 * 3、让MyPanel知道鼠标移动,拖拽
 * 4、让My知道窗口的变化(关闭、)
 * */
class MyPanel extends JPanel implements MouseListener,KeyListener,MouseMotionListener,WindowListener{
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		
	}
	//1、鼠标点击
	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("鼠标点击了x="+e.getX()+"y="+e.getY());
	}
//2、鼠标移动到MyPanel
	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("鼠标来了");
	}
	//3、鼠标离开MyPanel

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("鼠标离开了");
	}
//4.鼠标按下
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	//5.鼠标释放
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	//键按下
	@Override
	public void keyPressed(KeyEvent e) {
	// TODO Auto-generated method stub
	System.out.println(e.getKeyChar()+"被按下");
	}
	//键松开
	@Override
	public void keyReleased(KeyEvent e) {
	// TODO Auto-generated method stub
	
	}
	//键输入
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
	
	}
	@Override
	public void mouseDragged(MouseEvent e) {
	// TODO Auto-generated method stub
	
	}
	@Override
	public void mouseMoved(MouseEvent e) {
	// TODO Auto-generated method stub
		System.out.println("鼠标当前坐标x="+e.getY());
	}
	//窗口激活
	@Override
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口重新打开");
	}
	//窗口在关闭
	@Override
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口关闭");
	}
//	窗口最小化
	@Override
	public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口正在关闭");
	}
//	窗口最小化
	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口最小化");
		
	}
	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	//窗口打开
	@Override
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub
		System.out.println("窗口打开");
		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值