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

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.mzph.cn/pingmian/31604.shtml

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

相关文章

智能网联汽车实训教学“好帮手”——渡众机器人自动驾驶履带车

智能网联汽车实训教学“好帮手”——渡众机器人自动驾驶履带车 人工智能技术的兴起&#xff0c;为传统汽车行业注入了强有力的变革基因&#xff0c;以AI技术为驱动的无人驾驶成为汽车产业的未来&#xff0c;同样也面临诸多机遇和挑战。 一方面智能网联汽车的发展&#xff0c;为…

GD32学习

参考视频13.立创开发板GD32教程&#xff1a;串口配置_哔哩哔哩_bilibili 固件库跟用户手册基本上差不多&#xff0c;只不过用用户手册编写程序的话会更加的底层&#xff0c;固件库的话就是把一些函数封装起来&#xff0c;用的时候拿过来即可&#xff0c;目前我还没有找到固件库…

【数据库备份完整版】物理备份、逻辑备份,mysqldump、mysqlbinlog的备份方法

【数据库备份完整版】物理备份、逻辑备份&#xff0c;mysqldump、mysqlbinlog的备份方法 一、物理备份二、逻辑备份1.mysqldump和binlog备份的方式&#xff1a;2.mysqldump完整备份与恢复数据2.1 mysqldump概念2.2 mysqldump备份2.3 数据恢复2.4 **使用 Cron 自动执行备份**2.5…

linux下编译安装和使用cURL库(含有openssl)

cURL是一个利用URL语法指定各种协议(如HTTP、HTTPS、FTP等)进行数据传输的工具,它以客户端的身份,允许用户通过命令行与服务器交互。cURL库(libcurl)是cURL的编程接口(API),提供了一套丰富的函数,供开发者在自己的应用程序中实现网络传输功能 cURL库是网络编程中不可…

搭建一个简单的xxljob

数据库表结构&#xff1a; YyJobInfo&#xff1a; public class YyJobInfo {//定时任务idprivate int id;//该定时任务所属的执行器的idprivate int jobGroup;//定时任务描述private String jobDesc;//定时任务添加的时间private Date addTime;//定时任务的更新时间private D…

服务器权限管理

我们linux服务器上有严格的权限等级&#xff0c;如果权限过高导致误操作会增加服务器的风险。所以对于了解linux系统中的各种权限及要给用户&#xff0c;服务等分配合理的权限十分重要。&#xff08;权限越大&#xff0c;责任越大&#xff09; 1.基本权限 U--user用户,G-group…

智谱API调用

一、智谱API 文心一言api 千帆大模型平台 申请和使用 智谱AI开放平台 登录智谱AI开放平台&#xff0c;点击右上角的开发者工作台&#xff0c;然后查看自己的API glm-4 接口 conda create -n zhipuai python3.10 -y 二、如何使用 这边的介绍是根据官方文档的接口文档来进行介绍…

深度学习之绘图基础

文章目录 1.实验目的2. 需求3.代码结果图片 1.实验目的 熟练绘制各种图像&#xff0c;为深度学习打基础 2. 需求 给定一个函数&#xff0c;需要你画出原图像以及这个函数在某点切线图像 3.代码 # File: python绘制函数图像以及倒数图像.py # Author: chen_song # Time: 20…

绽放光彩的小程序 UI 风格

绽放光彩的小程序 UI 风格

vivado WIRE

WIRE是用于在Xilinx部件上路由连接或网络的设备对象。一根电线 是单个瓦片内部的一条互连金属。PIP、系紧装置和 SITE_PINs。 提示&#xff1a;WIRE对象不应与设计的Verilog文件中的WIRE实体混淆。那些 电线在设计中与网络有关&#xff0c;而不是与定义的设备的路由资源有关 WI…

创业众筹网

摘 要 创业是社会经济发展的重要动力&#xff0c;其在任何经济发展时期任何国家都最具活力与桃战性。然而创业的资金却是90%创业者面临的首要问题。包括积蓄不足、无不动产、负债、不知如何向银行申贷,及无法预估所创行业之总资金、成本。部分创业者虽然有心创业&#xff0c;但…

AI创作音乐引发的深思

在最近一个月中&#xff0c;音乐大模型的迅速崛起让素人生产音乐的门槛降到了最低。这一变革引发了关于AI能否彻底颠覆音乐行业的广泛讨论。在初期的兴奋过后&#xff0c;人们开始更加理性地审视AI在音乐领域的应用&#xff0c;从版权归属、原创性、创作质量、道德层面以及法律…

【读论文】Learning perturbations to explain time series predictions

文章目录 Abstract1. Introduction2. Background Work3. Method4. Experiments4.1 Hidden Markov model experiment4.2 MIMIC-III experiment 5. ConclusionReferences 论文地址&#xff1a;Learning Perturbations to Explain Time Series Predictions代码地址&#xff1a;htt…

深度学习Week17——优化器对比实验

文章目录 深度学习Week17——优化器对比实验 一、前言 二、我的环境 三、前期工作 1、配置环境 2、导入数据 2.1 加载数据 2.2 检查数据 2.3 配置数据集 2.4 数据可视化 四、构建模型 五、训练模型 1、将其嵌入model中 2、在Dataset数据集中进行数据增强 六、模型评估 1、Accur…

鸿蒙 登录界面示例

1.b站登录界面 我的b站教学视频&#xff1a;https://www.bilibili.com/video/BV1LQgQexEGm/?spm_id_from333.999.0.0&vd_sourced0ea58f1127eed138a4ba5421c577eb1 最终实现效果&#xff1a; 需要准备2张图片&#xff0c;分别是向下和向右边的图标 代码&#xff1a; En…

第1章 MySQL数据库概述

1.1 基本概念 数据库是什么&#xff1f; 存储数据的地方 DB&#xff1a;数据库&#xff08;Database&#xff09; 为什么要用数据库&#xff1f; 因为应用程序产生的数据是在内存中的&#xff0c;如果程序退出或者是断电了&#xff0c;则数据就会消失。使用数据库是为了…

硬件开发笔记(二十一):外部搜索不到的元器件封装可尝试使用AD21软件的“ManufacturerPart Search”功能

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139869584 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

探索图神经网络(GNN):使用Python实现你的GNN模型

一、引言 图神经网络&#xff08;Graph Neural Network, GNN&#xff09;作为近年来机器学习和深度学习领域的热门话题&#xff0c;正逐渐吸引越来越多的研究者和开发者的关注。GNN能够处理图结构数据&#xff0c;在社交网络分析、推荐系统、化学分子结构预测等领域有着广泛的…

学校校园考场电子钟,同步授时,助力考场公平公正-讯鹏科技

随着教育技术的不断发展&#xff0c;学校对于考场管理的需求也日益提高。传统的考场时钟往往存在时间误差、维护不便等问题&#xff0c;这在一定程度上影响了考试的公平性和公正性。为了解决这些问题&#xff0c;越来越多的学校开始引入考场电子钟&#xff0c;通过同步授时技术…

HTTP 状态码详解及使用场景

目录 1xx 信息性状态码2xx 成功状态码3xx 重定向状态码4xx 客户端错误状态码5xx 服务器错误状态码 HTTP思维导图连接&#xff1a;https://note.youdao.com/s/A7QHimm0 1xx 信息性状态码 100 Continue&#xff1a;表示客户端应继续发送请求的其余部分。 使用场景&#xff1a;客…