绘图原理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("窗口打开");
}
}