韩顺平零基础30天学会Java【章14 绘图和事件处理】

谭浩皛
2023-12-01

P570~P572

快速入门,DrawCircle.java

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

public class DrawCircle extends JFrame {//JFrame对应窗口,可以理解成是一个画框
    //定义一个面板
    private MyPanel mp = null;
    public static void main(String[] args) {
        new DrawCircle();
    }
    public DrawCircle() {
        //初始化面板
        mp = new MyPanel();
        //把面板放入到窗口
        this.add(mp);
        //设置窗口大小
        this.setSize(400, 300);
        //点击窗口关闭,程序真正退出
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置显示窗口
        this.setVisible(true);
    }
}

class MyPanel extends JPanel {
    //说明
    //MyPanel,理解成一个画板
    //Graphics g,g是一个画笔
    //Graphics提供很多方法
    @Override
    public void paint(Graphics g) {//Graphics绘图
        super.paint(g);//调用父类方法完成初始化
        System.out.println("paint被调用");
        g.drawOval(10, 10, 100, 100);
    }
}

绘图原理

  1. Component类提供了两个和绘图相关的方法
  2. paint(Graphics g)绘制组建外观
  3. repaint()刷新组件外观

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

以下情况paint()会被调用:

  1. 窗口最小化,再最大化
  2. 窗口大小发生变化
  3. repaint方法被调用

绘图技术,GraphicsMethod.java

Graphics类,理解成画笔,为我们提供绘图方法

  1. drawLine(int x1,int y1,int x2,int y2):画直线
  2. drawRect(int x1,int y1,int width,int height):画矩形边框
  3. drawOval(int x1,int y1,int width,int height):画椭圆边框
  4. fillRect(int x1,int y1,int width,int height):填充矩形
  5. fillOval(int x1,int y1,int width,int height):填充椭圆
  6. drawImage(Image img,int x,int y,int width,int height):画图片
  7. drawString(String str,int x,int y):画字符串
  8. setFont(Font font):设置画笔字体
  9. setColor(Color c):设置画笔颜色
import javax.swing.*;
import java.awt.*;

public class GraphicsMethod extends JFrame {
    private MyPanel2 mp = null;
    public GraphicsMethod(){
        mp=new MyPanel2();
        this.add(mp);
        this.setSize(300,400);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new GraphicsMethod();
    }
}

class MyPanel2 extends JPanel{
    @Override
    public void paint(Graphics g) {
        super.paint(g);
//        1. drawLine(int x1,int y1,int x2,int y2):画直线
        g.drawLine(0,0,50,50);
//        2. drawRect(int x1,int y1,int width,int height):画矩形边框
        g.drawRect(50,0,50,50);
//        3. drawOval(int x1,int y1,int width,int height):画椭圆边框
        g.drawOval(100,0,50,50);
//        4. fillRect(int x1,int y1,int width,int height):填充矩形
        g.fillRect(150,0,50,50);
//        5. fillOval(int x1,int y1,int width,int height):填充椭圆
        g.setColor(Color.orange);
        g.fillOval(200,0,50,50);
//        6. drawImage(Image img,int x,int y):画图片
        //获取图片资源
        Image image=Toolkit.getDefaultToolkit().getImage(MyPanel2.class.getResource("bg.jpg"));
        g.drawImage(image,100,100,this);
//        g.drawImage
//        7. drawString(String str,int x,int y):画字符串
//        8. setFont(Font font):设置画笔字体
        g.setFont(new Font("黑体",Font.BOLD,50));
        g.drawString("12345",0,60);//对应字体左下角
//        9. setColor(Color c):设置画笔颜色
    }
}

事件处理,BallMove.java

java事件采取“委派事件模型”,当事件发生时,产生事件的对象,会把信息传递给事件的监听者处理,这里说的事件是java.awt.event事件类库里某个类所创建的对象,把它称为事件的对象

  1. 事件源:是一个产生事件的对象,如按钮、窗口等
  2. 事件:承载事件源状态改变时的对象,比如键盘事件、鼠标事件、窗口事件等,会产生一个事件对象,该对象保存着当前事件很多信息,比如KeyEvent对象有含有被按下键的Code值,java.awt.event和javax.swing.event包中定义了各种事件类型
  3. 事件类型
    1. ActionEvent
    2. AdjustmentEvent
    3. ComponentEvent
    4. ContainerEvent
    5. KeyEvent
    6. MouseEvent
    7. TextEvent
    8. WindowEvent
    9. FocusEvent
    10. ItemEvent
  4. 事件监听器接口
    1. 当事件源产生一个事件,可以传送给事件监听者处理
    2. 事件监听者实际上是个类,该类实现了某个事件监听器接口,对接收到的事件进行处理
    3. 事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现多个监听接口
    4. 这些接口在java.awt.event和javax.swing.event包中定义
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class BallMove extends JFrame {
    MyPanel3 mp=null;
    public BallMove(){
        mp = new MyPanel3();
        this.add(mp);
        //JFrame可以监听键盘事件
        this.addKeyListener(mp);
        this.setSize(400,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    public static void main(String[] args) {
        new BallMove();
    }
}
//keylistener监听键盘
class MyPanel3 extends JPanel implements KeyListener {
    int x=10;
    int y=10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x,y,20,20);
    }
    //有字符输出时该方法就会触发
    @Override
    public void keyTyped(KeyEvent e) {
    }
    //当某个键按下时该方法触发
    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println((char)e.getKeyCode()+"被按下");
        //根据用户按下的不同键处理移动
        if(e.getKeyCode()== KeyEvent.VK_DOWN){
            y++;
        }else if (e.getKeyCode()== KeyEvent.VK_UP){
            y--;
        }else if (e.getKeyCode()== KeyEvent.VK_LEFT){
            x--;
        }else if (e.getKeyCode()== KeyEvent.VK_RIGHT){
            x++;
        }
        this.repaint();
    }
    //当某个键释放时该方法触发
    @Override
    public void keyReleased(KeyEvent e) {
    }
}
 类似资料: