韩顺平0基础学java——第28天

news/2024/7/7 13:56:35/文章来源:https://blog.csdn.net/m0_50959806/article/details/139856271

p569-591

坦克大战!(绘图+监听事件+线程+文件处理)


绘图

绘图原理

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

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

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

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

在以下情况paint0将会被调用:
1.窗口最小化再最大化
2窗口的大小发生变化
3. repaint方法被调用

绘图方法

Graphics类
Graphics类你可以理解就是画笔,为我们提供了各种绘制图形的方法:[参考jdk帮助文档]

1.画直线drawLine(int x1,int y1,int x2.int y2)
2.画矩形边框drawRect(int x, int y, int width, int height)

3.画椭圆边框drawOval(int x, int y, int width, int height)

4.填充矩形 fillRect(int x, int y, int width, int height)
5.填充椭圆fillOval(int x, int y, int width, int height)

6.画图片drawlmage(lmage img, int x, int y., ..)
7.画字符串drawString(String str, int x, int y)

8.设置画笔的字体setFont(Font font)
9设置画笔的颜色setColor(Color c)

使用代码:

class MyPanel extends JPanel{//panel是画板@Overridepublic void paint(Graphics g) {//Graphics的g是画笔super.paint(g);//调用父类方法完成初始化。?初始化了谁?// g.drawOval(10,10,150,125);//画圆(椭圆// g.drawLine(10,10,100,100);//直线//g.drawRect(10,10,100,100);//矩形// g.setColor(Color.BLUE);//设置画笔颜色//g.fillRect(10,10,100,100);//填充矩形//g.setColor(Color.RED);//设置为红色//g.fillOval(10,10,100,100);//填充圆// Image im1 = Toolkit.getDefaultToolkit().getImage("D:\\madake\\02.jpg");//加载图片//g.drawImage(im1,10,10,175,221,this );//卧槽成功了!//g.setColor(Color.RED);//画字符串,设置字体等//g.setFont(new Font("隶书",Font.BOLD,50));//字体和颜色//g.drawString("四斋蒸鹅心",100,100);//小细节,这个100,100是字符串的左下角}
}

画坦克

package com.day28.TankGame;
import javax.swing.JPanel;
import java.awt.*;public class MyPanel extends JPanel {Mytank hero = null;public MyPanel(){hero = new Mytank(100,100);//初始化自己坦克的位置}@Overridepublic void paint(Graphics g) {super.paint(g);g.fillRect(0,0,1000,750);//专门写一个方法来画坦克drawTank(hero.getX(),hero.getY(),g,0,0);drawTank(hero.getX()+60,hero.getY(),g,0,1);}/**** @param x 坦克的左上角坐标* @param y 坦克右上角坐标* @param g 画笔* @param direct 方向* @param type 坦克类型(敌人的还是我的?*/public void drawTank(int x,int y,Graphics g,int direct,int type){switch (type){case 0://我的坦克g.setColor(Color.cyan);break;case 1://敌人的坦克g.setColor(Color.yellow);break;}//根据坦克的方向来绘制switch (direct){case 0:{Graphics2D g2d = (Graphics2D) g;g2d.setStroke(new BasicStroke(5));g.fill3DRect(x,y,10,60,false);//左轮子g.fill3DRect(x+30,y,10,60,false);//右轮子g.fill3DRect(x+10,y+10,20,40,false);//身体g.fillOval(x+10,y+20,20,20);//炮台g.drawLine(x+20,y,x+20,y+30);//炮break;}default:System.out.println("其他情况暂未处理!");}}
}

事件处理机制:移动控制 

监听键盘KeyListener

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

1.前面我们提到几个重要的概念事件源,事件,事件监听器我们下面来全面的介绍它们。
2事件源:事件源是一个产生事件的对象,比如按钮,窗口等。
3.事件:事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件等等,会生成一个事件对象,该对象保存着当前事件很多信息,比如KeyEvent对象有含有被按下键的Cod值。java.awt.event包和javax.swing.event包中定义了各种事件类型
5.事件监听器接口:
⑴当事件源产生一个事件,可以传送给事件监听者处理
(2)事件监听者实际上就是一个类,该类实现了某个事件监听器接口比如前面我们案例中的MyPanle就是一个类,它实现了KeyListener接口,它就可以作为一个事件监听者,对接受到的事件进行处理
(3)事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现多个监听接口
(4)这些接口在java.awt.event包和javax.swing.event包中定义。列出常用的事件监听器接口,查看jdk文档聚集了.

让坦克动起来

动了


请大家在HspTankGame02.java基础上画出三辆敌人的坦克,注意颜色。如图所示·分析:
1.因为敌人的坦克,是在MyPanel上,所以我们的代码在MyPanel
2.因为敌人的坦克,后面有自己特殊的属性和方法,可以单开一个EnemyTank

3.敌人坦克数量多,可以放入到集合Vector ,因为考虑多线程问题

线程基础

进程

1.进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为
该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间。
2.进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的
产生、存在和消亡的过程

惊吓

什么是线程

1.线程由进程创建的,是进程的一个实体

2一个进程可以拥有多个线程,如“我使用迅雷的时候,可以同时下载多个文件,每一个下载任务就对应一个线程”。

3.单线程:同一个时刻,只允许执行一个线程
4.多线程:同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件

5.并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单的说,单核cpu实现的多任务就是并发。
4.并行:同一个时刻,多个任务同时执行。多核cpu可以实现并行。

比如这个电脑就是8核cpu

Thread类

1.当一个类继承了Thread类,该类就可以当做一个线程。

2.我们通常会重写run方法,写上自己的业务代码。

3. run Thread类实现了Runnable接口的run方法


线程源码追踪

1.当我们点run的时候就进入一个进程

2.进程启动后就开启一个线程

System.out.println("喵喵喵~"+i+"次"+Thread.currentThread().getName());//这是线程名

3.当Cat.start()开始时,主线程不会阻塞,会继续执行。(间隔1000ms)

所以你们单核cpu就并发,多核就并行? 

4.JConsole可以监控线程执行的情况

public class Cup {public static void main(String[] args) {Cat cat = new Cat();cat.start();//启动线程,我调用这个的时候就会调用run,为啥不直接run?//因为run只是个普通的方法,并不会真正启动线程。这样就会把run执行完毕才向下。//相当于它是main的一部分,在main线程里。for (int i = 0; i < 60; i++) {System.out.println("主线程!"+i+Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}class Cat extends Thread{@Overridepublic void run() {int i =0;while(i++<65){System.out.println("喵喵喵~"+i+"次"+Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

最后都涉及到操作系统了。

线程的基本使用


.1. java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时在用继承Thread类方法来创建线程显然不可能了。
2. java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程

public class Xianche {public static void main(String[] args) {Dog dog = new Dog();Thread t = new Thread(dog);//把狗放进去,静态代理。t.start();}
}class Dog implements Runnable{int count =0;@Overridepublic void run() {while(count++<10){System.out.println("狗叫!");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

继承Thread vs 实现Runnable的区别

1.从java的设计来看,通过继承Thread或者实现Runnasle接口来创建线程本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口
2.实现Runnable接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制

线程终止

基本说明
1.当线程完成任务后,会自动退出。
2.还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式
        说人话就是,再main线程里写个控制 小线程的loop的语句

        同时,小线程的loop默认为true,放在while里

线程常用方法

常用方法第一组
1.setName //设置线程名称,使之与参数name相同

2. getName //返回该线程的名称
3.start//使该线程开始执行;Java虚拟机底层调用该线程的startO 方法

4.run//调用线程对象 run方法;
5.setPriority //更改线程的优先级

6.getPriority //获取线程的优先级
7.sleep1/在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)

8. interrupt //中断线程
注意事项和细节
1.start底层会创建新的线程,调用run,run 就是一个简单的方法调用,不会启动新线程
2.线程优先级的范围:max,min,nom


3. interrupt,中断线程,但并没有真正的结束线程。所以一般用于中断正在休眠线程4.sleep:线程的静态方法,使当前线程休眠。

常用方法第二组
1. yield:线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功
2. join:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务
案例:创建一个子线程,每隔1s输出hello,输出20次,主线程每隔1秒,输出hi,输出20次.要求:两个线程同时执行,当主线程输出5次后,就让子线程运行完毕,主线程再继续
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1092806.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过 Setapp 使用 240 多款 Mac 生产力工具以及 GPT-4o

Setapp 是一项革命性的订阅服务&#xff0c;可以使用 240 多款 Mac 应用程序的综合套件&#xff0c;并配有强大的人工智能助手。 通过 Setapp 为你的工作效率和生产力增添魔力。 Setapp 官网&#xff1a;访问&#xff08;提供 7 天试用&#xff09; Setapp 的主要功能 AI 助手…

Python爬取中国福彩网彩票数据并以图表形式显示

网页分析 首先打开中国福彩网&#xff0c;点击双色球&#xff0c;选择往期开奖栏目 进入栏目后&#xff0c;选定往期的奖金数目作为我们想要爬取的目标内容 明确目标后&#xff0c;开始寻找数据所在的位置 鼠标右击页面&#xff0c;打开网页源代码&#xff0c;在源代码中搜索…

临时关闭Windows安全中心

在使用WindowsOS是&#xff0c;微软安全中心是我们必不可少的安全防护&#xff0c;但有时我们也会产生想要将其关闭的需求&#xff0c;下面将要介绍如何临时关闭Windows的安全中心 一、打开安全中心、选择“病毒与威胁防护”&#xff0c;点击“管理设置” 之后将其实时保护关闭…

Linux企业实时同步服务---3688字

实时同步服务 正常的互联网公司架构&#xff1a; 内容&#xff1a;每天服务器及服务器上的应用程序等正常使用&#xff08;每天查看&#xff09;比如&#xff1a;邮件&#xff0c;短信&#xff0c;等信息&#xff1b;巡检内容是否正常使用。互联网公司就是底层服务开发、代码运…

C++ (week8):数据库

文章目录 一、数据库简介1.数据库2.MySQL(1)数据库的结构(2)MySQL的三种使用方式(3)命令行(4)Navicat Premium 二、SQL1.SQL (Structured Query Language)&#xff0c;即结构化查询语言2.数据定义语言 DDL (Data Definition Language) &#xff0c;创建、修改、删除数据库、表结…

QT listView的简单使用

本文章实现了添加数据&#xff0c;插入数据及删除和清空。用到了Qmessage做为消息提示。lineEdit用于数据的收入&#xff0c;lable用来显示所选中的数据位置的索引。具体代码如下&#xff1a;

go gin web服务器使用fvbock/endless优雅地重启或停止

gin使用fvbock/endless gin 正常使用注册路由时&#xff1a; package mainimport "github.com/gin-gonic/gin"func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})r.Run()…

Kompas AI自然语言处理能力对比

一、引言 自然语言处理&#xff08;NLP&#xff09;是衡量人工智能&#xff08;AI&#xff09;系统智能程度的重要指标之一。NLP技术的进步使得机器能够理解、解释和生成人类语言&#xff0c;在各个领域中发挥了巨大的作用。本文将对比Kompas AI与其他主要AI产品在NLP方面的表…

【ARMv8/v9 GIC 系列 3 -- GIC 的 类型寄存器 GICD_TYPER】

文章目录 GIC 类型寄存器 GICD_TYPERESPI_Range, 位[31:27]RSS, 位[26]No1N, 位[25]A3V, 位[24]IDBits, 位[23:19]DVIS, 位[18]LPIs, 位[17]MBIS, 位[16]NUM_LPIs, 位[15:11]SecurityExtn, 位[10]NMI, 位[9]ESPI, 位[8]CPUNumber, 位[7:5]ITLinesNumber, 位[4:0]GIC 类型寄存器…

计算机系统基础知识(上)

目录 计算机系统的概述 计算机的硬件 处理器 存储器 总线 接口 外部设备 计算机的软件 操作系统 数据库 文件系统 计算机系统的概述 如图所示计算机系统分为软件和硬件&#xff1a;硬件包括&#xff1a;输入输出设备、存储器&#xff0c;处理器 软件则包括系统软件和…

成都晨持绪科技:2024年抖音网店做起来难吗

随着抖音平台的日益火爆&#xff0c;越来越多的商家和个人开始关注并尝试开设自己的抖音网店。然而&#xff0c;面对激烈的市场竞争和不断变化的平台规则&#xff0c;许多人都在问&#xff1a;2024年抖音网店做起来难吗? 要回答这个问题&#xff0c;我们首先需要了解抖音网店的…

网络安全等级保护测评

网络安全等级保护 《GB17859 计算机信息系统安全保护等级划分准则》 规定计算机信息系统安全保护等级共分五级 《中华人民共和国网络安全法》 “国家实行网络安全等级保护制度。 等级测评 测评机构依据国家网络安全等级保护制度规定&#xff0c;按照有关 管理规范和…

执行shell脚本出现 $‘ \r‘ 符号导致执行失败【解决】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Linux-磁盘管理与文件系统

目录 一、磁盘结构 1、磁盘的物理结构 2、磁盘的数据结构 3、磁盘存储容量 4、接口类型 二、磁盘分区 1、磁盘的两种分区方式 1.1、MBR分区 1.2、GPT分区 三、查看硬盘的分区情况 1、Fdisk—查询磁盘设备 2、lsblk—以树形查看磁盘分区 3、blkid—查看磁盘的UUID …

IDEA集成Docker实现快捷部署

本文已收录于专栏 《运维》 目录 背景介绍优势特点操作步骤一、修改Docker配置二、配置Docker插件三、编写Maven插件四、构建Docker镜像五、创建Docker容器 总结提升 背景介绍 在我们手动通过Docker部署项目的时候&#xff0c;都是通过把打包好的jar包放到服务器上并且在服务器…

SpringCloud之Nacos

SpringCloud之Nacos 一、微服务介绍 1. 什么是微服务 2014年&#xff0c;Martin Fowler&#xff08;马丁福勒 &#xff09; 提出了微服务的概念&#xff0c;定义了微服务是由以单一应用程序构成的小服务&#xff0c;自己拥有自己的进程与轻量化处理&#xff0c;服务依业务功能…

Python处理消息队列库之kombu使用详解

概要 在现代应用程序开发中,消息队列是实现异步任务处理和微服务通信的重要组件。Kombu 是一个用于在 Python 中处理消息的库,它提供了一个统一的接口来访问不同的消息队列后端,如 RabbitMQ、Redis 等。Kombu 设计简洁、功能强大,使得开发者可以轻松地在应用中集成消息队列…

Jetpack数据绑定 (DataBinding)

数据绑定&#xff08;DataBinding&#xff09;是Jetpack库中的一个重要功能&#xff0c;旨在通过减少手动的UI更新和绑定操作来提高开发效率和代码的可维护性。它使我们可以在布局文件中直接绑定UI组件与数据源&#xff0c;从而实现更清晰和模块化的代码结构。 什么是数据绑定…

Excel 快速查询工具 2023.7.1 更新

Excel 快速查询工具作者表示这个软件是因为有时候需要在 Excel 和网站之间进行切换非常的麻烦&#xff0c;这款软件可以以半透明的方框位于桌面上。 特点 软件窗口半透明并至于顶部&#xff0c;无需来回切换界面。 实时查询&#xff0c;不用点击查询或者按回车之类的&#x…

无糖管家,使用语音控制终端

无糖管家&#xff0c;使用语音控制终端。 github传送门 这个项目是目前最成熟的项目 支持英雄联盟自动点击接受等各种功能 支持用户自定义代码&#xff0c;上传审核过后&#xff0c;所有人可以语音调用该代码 官网无糖管家