韩顺平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.rhkb.cn/news/356270.html

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

相关文章

基于PSO粒子群优化的CNN-GRU的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 CNN-GRU模型架构 4.3 CNN-GRU结合PSO的时间序列预测 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软…

Ubuntu 18.04 安装 PCL 1.14.1

在进行科研项目时&#xff0c;我们常常需要将 C 和 Python 结合起来编程。然而&#xff0c;每次将 PCL&#xff08;Point Cloud Library&#xff09;的内容添加到 CMakeLists.txt 文件中时都会报错。在深入分析后&#xff0c;我们推测可能是当前使用的 PCL 1.8 版本与现有程序不…

人工智能在空间转录组学领域的最新研究进展|顶刊速递·24-06-22

小罗碎碎念 本期推文的主题&#xff1a;人工智能在空间转录组学领域的最新进展 提到空间转录组学就不可避免会与单细胞测序、免疫治疗以及肿瘤微环境扯上关系&#xff0c;所以这也是当下的热点之一。 我个人认为这一部分门槛相对于影像组学和病理组学较高&#xff0c;需要具备…

MFC绘制哆啦A梦

文章目录 OnPaint绘制代码完整Visual Studio工程下载其他卡通人物绘制 OnPaint绘制代码 CPaintDC dc(this); // 用于绘画的设备上下文CRect rc;GetWindowRect(rc);int cxClient rc.Width();int cyClient rc.Height();// 辅助线HPEN hPen CreatePen(PS_DOT, 1, RGB(192, 192,…

STM32通过SPI软件读写W25Q64

文章目录 1. W25Q64 2. 硬件电路 3. W25Q64框架图 4. 软件/硬件波形对比 5. 代码实现 5.1 MyI2C.c 5.2 MyI2C.h 5.3 W25Q64.c 5.4 W25Q64.h 5.5 W25Q64_Ins.h 5.6 main.c 1. W25Q64 对于SPI通信和W25Q64的详细解析可以看下面这篇文章 STM32单片机SPI通信详解-CSDN博…

概念描述——TCP/IP模型中的两个重要分界线

TCP/IP模型中的两个重要分界线 协议的层次概念包含了两个也许不太明显的分界线&#xff0c;一个是协议地址分界线&#xff0c;区分出高层与低层寻址操作&#xff1b;另一个是操作系统分界线&#xff0c;它把系统与应用程序区分开来。 高层协议地址界限 当我们看到TCP/P软件的…

MySQL数据备份操作步骤

常见的数据备份命令 备份命令备份速度恢复速度介绍功能适用场景lvm2快照快快一般、支持几乎热备、速度快一般中小型数据量的备份cp快快物理备份、灵活性低很弱少量数据备份xtrabackup较快较快实现innodb热备、对存储引擎有要求强大较大规模的备份mysqldump慢慢逻辑备份、适用所…

【React】AntD组件---极客园--01.项目前置准备

项目搭建 基于CRA创建项目 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start调整项目目录结构 -src-apis 项目接口函数-assets 项目资源文件&…

【算法训练记录——Day32】

Day32——贪心算法Ⅱ 1.leetcode122买卖股票的最佳时机II2.leetcode55跳跃游戏3.leetcode45跳跃游戏II4.eetcode1005K次取反后最大化的数组和 目标&#xff1a; leetcode122买卖股票的最佳时机IIleetcode55跳跃游戏leetcode45跳跃游戏IIleetcode1005K次取反后最大化的数组和 1…

在Windows上用MinGW编译OpenCV项目运行全流程

一、准备软件 OpenCV源码CMake工具MinGW工具链&#xff08;需要选用 posix 线程版本&#xff1a;原因见此&#xff09; 二、操作步骤 官网提供了VC16构建版本的二进制包&#xff0c;但是没有给出GCC编译的版本。所以如果使用MinGW进行构建&#xff0c;那就只能从源码开始构建…

智慧公厕系统厂家的核心技术与光明源应用案例

随着城市化进程的加快和智慧城市建设的推进&#xff0c;智慧公厕系统在提升公共服务质量和用户体验方面发挥了重要作用。智慧公厕系统厂家的核心技术是确保这一系统高效运转和用户满意度的关键。以下将介绍智慧公厕系统厂家的核心技术&#xff0c;并通过光明源的应用案例展示其…

WordPress简单好看的线报主题模板源码

安装说明 到WordPress管理后台中的「外观」-「主题」中点击「添加」&#xff0c;选择baolog的主题包进行上传安装并启用即可。 提示&#xff1a;为了防止主题不兼容&#xff0c;请在安装主题前进行数据备份&#xff0c;防止数据字段重复覆盖等情况发生。 源码截图 源码下载 …

cefsharp 修改请求头request.Headers,以实现某种请求验证(v100+已测试)含主要源码和注释

(一)目的:cefsharp实现修改请求头 Tip:网上搜的很多代码都无法实现(要么版本较低,方法有变,要么就行不通),较多的错误是:集合属性只读。其中一个bili网友的测试方法注解一张图,但没有具体代码。参考一下。 (二)实现方法 2.1 创建对象 ChromiumWebBrowser home…

在敏捷项目管理中实施 Scrum 方法

在本文中&#xff0c;我将阐明敏捷项目管理中的 Scrum 流程。我将深入探讨 Scrum 方法论中不可或缺的角色。本文将全面概述敏捷开发中的 Scrum 流程。我将解释 Scrum 的核心组件&#xff0c;详细探索端到端 Scrum 流程。在本文结束时&#xff0c;您将清楚地了解 Scrum 的工作原…

【Linux】多线程2——线程控制

1.POSIX线程库 pthread线程库是应用层的原生线程库&#xff1a; 应用层指的是这个线程库并不是系统接口直接提供的&#xff0c;而是由第三方帮我们提供的。原生指的是大部分Linux系统都会默认带上该线程库。与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名…

学习es6

1、let变量 2、const常量 3、解构赋值 4、模板字符串 5、简化对象写法 6、参数默认值 7、rest参数 8、扩展运算符 9、扩展对象方法 10、扩展数组方法 11、Set 12&#xff0c;Promise 13、Module模块

JMeter的基本概念

一、主流测试工具 1&#xff0c;Loadrunner HP Loadrunner是一种工业级标准性能测试负载工具&#xff0c;可以模拟上万用户实施测试&#xff0c;并在测试时可实时检测应用服务器及服务器硬件各种数据&#xff0c;来确认和查找存在的瓶颈 支持多协议:Web(HTTP/HTML)、Windows…

NetSuite Non-Inventory Item 公司内外采购总账影响

上篇文章提到&#xff0c;Non-Inventory Item的科目维护会根据各个企业的实际情况而有所不同&#xff0c;通常情况下都涉及外部交易&#xff0c;即对外采购与销售&#xff1b;另外也涉及到公司内部的相关交易&#xff0c;本篇以采购为例&#xff0c;来看看公司内外采购交易所对…

性能工具之 JMeter 常用组件介绍(七)

文章目录 一、后置处理器1、Regular Expression Extractor(正则表达式提取器)2、JSON Extractor(JSON表达式提取器)3、Regular Expression Extractor(正则表达式提取器) 二、小结 本文主要介绍JMeter主流后置处理器的功能 一、后置处理器 从上面可以看出后置处理可以插件挺多&a…

从零开始的Ollama指南:部署私域大模型

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…