• java绘图技术基础


    1.在画板上绘制一个圆形

    JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,是一种轻量级容器,可以加入到JFrame窗体中。

    画圆源码:

    import javax.swing.*;
    import java.awt.*;
    
    /**
     * java绘制简单圆形
     * 继承JFrame框架
     */
    public class DrawCircle extends 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);
        }
    }
    
    /**
     * 定义一个画板
     * JPanel是java提供的一个绘图类
     */
    class MyPanel extends JPanel {
        // 定制画板初始化
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            // 画圆
            // 参数一:圆或椭圆四周包围的矩阵的左上角x坐标
            // 参数二:圆或椭圆四周包围的矩阵的左上角y坐标
            // 参数三:圆或椭圆的宽度
            // 参数四:圆或椭圆的高度
            g.drawOval(10,10,100,100);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    绘图原理:

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

    • paint(Graphics g)控制组件的外观
    • repaint()刷新组件的外观

    那么通过上面的代码可以发现,我们并没有显示的调用paint方法,然而它似乎自己调用了,这是为什么呢?✨

    在以下情况下paint将会被调用:😁

    • 组件第一次在屏幕显示的时候
    • 窗口最大化和最小化
    • 窗口大小发生变化
    • repaint方法被调用

    2.绘图常用方法

    上代码:

    import javax.swing.*;
    import java.awt.*;
    
    /**
     * java绘制方法演示
     */
    public class Draw extends JFrame{
        // 定义一个面板
        private MyPanel2 mp = null;
        public static void main(String[] args) {
            new Draw();
        }
    
        public Draw() {
            // 初始化面板
            mp = new MyPanel2();
            // 把面板放入窗口
            this.add(mp);
            // 设置窗口大小
            this.setSize(400,300);
            // 当点击窗口退出时,程序释放
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // 可视化
            this.setVisible(true);
        }
    }
    
    /**
     * 定义一个画板
     * JPanel是java提供的一个绘图类
     */
    class MyPanel2 extends JPanel {
        // 定制画板初始化
        @Override
        public void paint(Graphics g) {
            super.paint(g);
    
            // 从(10,10)到(100,100)的直线
            // g.drawLine(10,10,100,100);
    
            // 矩形,左上角(10,10)右上角(100,100)
            // g.drawRect(10,10,100,100);
    
            // 填充矩形,填充蓝色矩形,同样也可以进行填充圆形或椭圆
            // g.setColor(Color.BLUE);
            // g.fillRect(10,10,100,100);
    
            // 画字
            // 给画笔染色
            g.setColor(Color.BLUE);
            // 设置字体
            g.setFont(new Font("隶书",Font.BOLD,50));
            g.drawString("IMUSTCTF",70,100);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    3.java事件处理机制

    java事件处理是采取委派事件模型

    在这里插入图片描述

    JAVA事件处理机制,主要依托于java的键盘监听器实现:

    例如,我们想要实现一个最简的键盘监听器,可以测试如下的代码:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    /**
     * java事件处理机制
     */
    public class Event extends JFrame{
        private MyPanel3 mp = null;
        public static void main(String[] args) {
            Event event = new Event();
        }
    
        public Event() {
            // 初始化面板
            mp = new MyPanel3();
            // 把面板放入窗口
            this.add(mp);
            // 设置窗口大小
            this.setSize(400,300);
            // 当点击窗口退出时,程序释放
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // 可视化
            this.setVisible(true);
            // 设置监听mp键盘事件
            this.addKeyListener(mp);
        }
    }
    
    // KeyListener是一个监听器,可以监听键盘事件
    class MyPanel3 extends JPanel implements KeyListener {
        // 定制画板初始化
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            // 画一个填充的小球
            g.fillOval(10, 10, 20, 20);
        }
    
        // 有字符输出时,该方法就会被触发
        @Override
        public void keyTyped(KeyEvent keyEvent) {
    
        }
    
        // 当某个键按下,触发
        @Override
        public void keyPressed(KeyEvent keyEvent) {
            System.out.println((char)keyEvent.getKeyCode() + "被按下...");
        }
    
        // 某个键释放,触发
        @Override
        public void keyReleased(KeyEvent keyEvent) {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    通过按下不同的按键,控制台也会输出不同的结果,例如我们依次按下QWER

    Q被按下...
    W被按下...
    E被按下...
    R被按下...
    
    • 1
    • 2
    • 3
    • 4

    现在来上一个成品效果,利用方向键控制小球上下左右移动:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    /**
     * java事件处理机制
     */
    public class Event extends JFrame {
        private MyPanel3 mp = null;
    
        public static void main(String[] args) {
            Event event = new Event();
        }
    
        public Event() {
            // 初始化面板
            mp = new MyPanel3();
            // 把面板放入窗口
            this.add(mp);
            // 设置窗口大小
            this.setSize(400, 300);
            // 当点击窗口退出时,程序释放
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // 可视化
            this.setVisible(true);
            // 设置监听mp键盘事件
            this.addKeyListener(mp);
        }
    }
    
    // KeyListener是一个监听器,可以监听键盘事件
    class MyPanel3 extends JPanel implements KeyListener {
        int x = 10; // 小球的x坐标
        int y = 10; // 小球的y坐标
    
        // 定制画板初始化
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            // 画一个填充的小球
            g.fillOval(x, y, 20, 20);
        }
    
        // 有字符输出时,该方法就会被触发
        @Override
        public void keyTyped(KeyEvent keyEvent) {
    
        }
    
        // 当某个键按下,触发
        @Override
        public void keyPressed(KeyEvent keyEvent) {
            // 用户按下不同的方向键,改变小球的坐标
            if (keyEvent.getKeyCode() == KeyEvent.VK_DOWN) {
                y += 5;
            } else if (keyEvent.getKeyCode() == KeyEvent.VK_UP) {
                y -= 5;
            } else if (keyEvent.getKeyCode() == KeyEvent.VK_LEFT) {
                x -= 5;
            } else {
                x += 5;
            }
    
            // 重绘面板
            this.repaint();
        }
    
        // 某个键释放,触发
        @Override
        public void keyReleased(KeyEvent keyEvent) {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    python基础学习(7)
    《动手学深度学习 Pytorch版》 8.4 循环神经网络
    降低node/npm 到指定版本(Mac)详细教程
    Mybatis-动态SQL内置参数
    l8-d19 广播与组播
    linux中的cal 查看日历、用户管理命令、useradd 添加新用户
    Python常考面试题汇总
    leetcode算法每天一题027:移除元素
    简历编写指南及注意事项
    记录beforeRouteEnter函数内部 this 是undefined的解决方案
  • 原文地址:https://blog.csdn.net/Gherbirthday0916/article/details/126070027