GUI编程(一)

news/2024/5/17 11:28:21/文章来源:https://blog.csdn.net/Wztdx/article/details/130460411

1、简介

GUI的核心技术:Swing、 AWT
1、外观不太美观,组件数量偏少
2、运行需要JRE环境

为什么我们要学习?

  1. 组件(JTable,JList等)很多都是MVC的经典示范,学习也可以了解mvc架构。
  2. 工作时,也有可能遇见需要维护N年前awt/swing写的软件 (可能性极小)
  3. 可以写一些自己使用的软件

2、AWT

2.1 AWT介绍

  • AWT(Abstract Window Toolkit),中文译为抽象窗口工具包。包括了很多类和接口,用于Java Application的GUI(Graphics User Interface 图形用户界面)编程。
  • GUI的各种元素(如:窗口,按钮,文本框等)由Java类来实现。
  • 使用AWT所涉及的类一般在Java.AWT包及其子包中。
  • Container和Component是AWT中的两个核心类。

在这里插入图片描述

2.2 组件和容器

//GUI的第一个界面
public class TestFrame {public static void main(String[] args) {//这里只是在内存里面创建了一个窗口对象 还不能真正显示出来然我们看到Frame frame = new Frame("My First Java GUI");frame.setVisible(true);frame.setSize(400,400);frame.setBackground(new Color(229, 106, 106));//设置窗体出现时的位置,如果不设置则默认在左上角(0,0)位置显示frame.setLocation(200,200);//窗口大小固定frame.setResizable(false);}
}

此时是无法通过窗口的叉来关闭窗口的,需要手动关闭程序运行

我们进行封装,一次new出多个窗口

public class TestFrame2 {public static void main(String[] args) {MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.blue);MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.yellow);MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.red);MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, Color.green);}
}class MyFrame extends Frame{//可能存在多个窗口,需要一个计数器static int id=0;public MyFrame(int x,int y,int w,int h,Color color){super("MyFrame "+(++id));setBounds(x,y,w,h);setVisible(true);setBackground(color);}
}

在这里插入图片描述

2.3 Panel

//Panel可以看成是一个空间,但是不能单独存在
public class TestPanel {public static void main(String[] args) {Frame frame=new Frame();Panel panel = new Panel();//设置布局frame.setLayout(null);frame.setBounds(300,300,500,500);frame.setBackground(Color.pink);frame.setVisible(true);//panel设置坐标,相对于framepanel.setBounds(50,50,100,100);panel.setBackground(new Color(78, 210, 159));frame.add(panel);frame.setVisible(true);//监听事件,监听窗口关闭事件//适配器模式frame.addWindowListener(new WindowAdapter() {//窗口点击关闭时要做的事情@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

在这里插入图片描述

2.4 布局管理器

  • 流式布局
  • 东南西北中
  • 表格布局

2.4.1 流式布局

public class TestFlowLayout {public static void main(String[] args) {Frame frame = new Frame();Button button1 = new Button("button1");Button button2 = new Button("button2");Button button3 = new Button("button3");//设置为流式布局  默认居中frame.setLayout(new FlowLayout());//frame.setLayout(new FlowLayout(FlowLayout.LEFT));//frame.setLayout(new FlowLayout(FlowLayout.RIGHT));frame.setSize(200,200);frame.setVisible(true);frame.add(button1);frame.add(button2);frame.add(button3);}
}

2.4.2 东南西北中

public class TestBorderLayout {public static void main(String[] args) {Frame frame = new Frame("TestBorderLayout");Button east = new Button("East");Button west = new Button("West");Button south = new Button("South");Button north = new Button("North");Button center = new Button("Center");frame.add(east,BorderLayout.EAST);frame.add(west,BorderLayout.WEST);frame.add(south,BorderLayout.SOUTH);frame.add(north,BorderLayout.NORTH);frame.add(center,BorderLayout.CENTER);frame.setSize(300,300);frame.setVisible(true);frame.addWindowListener(new WindowAdapter(){@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

2.4.3 表格布局

public class TestGridLayout {public static void main(String[] args) {Frame frame = new Frame("TestGridLayout");Button button1 = new Button("button1");Button button2 = new Button("button2");Button button3 = new Button("button3");Button button4 = new Button("button4");Button button5 = new Button("button5");Button button6 = new Button("button6");frame.setLayout(new GridLayout(3,2));frame.add(button1);frame.add(button2);frame.add(button3);frame.add(button4);frame.add(button5);frame.add(button6);frame.setSize(200,200);frame.setVisible(true);}
}

现在学会了这三个布局和面板,检验一下,完成这个案例
在这里插入图片描述

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Test {public static void main(String[] args) {Frame frame=new Frame();frame.setVisible(true);frame.setSize(400,400);frame.setBackground(Color.pink);frame.setLocation(300,400);frame.setLayout(new GridLayout(2,1));//4个面板Panel p1 = new Panel(new BorderLayout());Panel p2 = new Panel(new GridLayout(2, 1));Panel p3 = new Panel(new BorderLayout());Panel p4= new Panel(new GridLayout(2, 2));p1.add(new Button("East-1"),BorderLayout.EAST);p1.add(new Button("West-1"),BorderLayout.WEST);p2.add(new Button("p2-Button1"));p2.add(new Button("p2-Button2"));p1.add(p2,BorderLayout.CENTER);p3.add(new Button("East-2"),BorderLayout.EAST);p3.add(new Button("West-2"),BorderLayout.WEST);p4.add(new Button("p4-Button1"));p4.add(new Button("p4-Button2"));p4.add(new Button("p4-Button3"));p4.add(new Button("p4-Button4"));p3.add(p4,BorderLayout.CENTER);frame.add(p1);frame.add(p3);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}

在这里插入图片描述

2.5 事件监听

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TestActionEvent {public static void main(String[] args) {//按下按钮,触发一些事件Frame frame = new Frame();Button button = new Button("Button");//addActionListener() 需要一个ActionListener,所以我们需要构造一个ActionListenerbutton.addActionListener(new MyActionListener());frame.add(button,BorderLayout.CENTER);frame.pack();frame.setVisible(true);//关闭窗口windowClose(frame);}//关闭窗体的事件private static void windowClose(Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}class MyActionListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("Button");}
}

可以看到当我们点击Button的时候,会触发事件,这个事件正是我们重写的actionPerformed方法中的内容
在这里插入图片描述

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TestActionEvent2 {public static void main(String[] args) {Frame frame = new Frame();Button button1 = new Button("start");Button button2 = new Button("stop");button1.setActionCommand("开始");button2.setActionCommand("停止");button1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("msg: "+e.getActionCommand());}});button2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("msg: "+e.getActionCommand());}});frame.setLayout(new GridLayout(2,1));frame.add(button1);frame.add(button2);frame.pack();frame.setVisible(true);//关闭窗口windowClose(frame);}//关闭窗体的事件private static void windowClose(Frame frame) {frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

在这里插入图片描述

这里也可以写一个实现类来实现ActionListener,两个按钮 实现同一个监听

2.6 TextField事件监听

package com.demo2;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TestTextField {public static void main(String[] args) {new MyFrame();}
}
class MyFrame extends Frame{public MyFrame(){TextField textField = new TextField();add(textField);//监听这个文本框输入的文字//按下enter,就会触发这个事件textField.addActionListener(new MyActionListener2());//设置替换编码textField.setEchoChar('*');setVisible(true);pack();}
}class MyActionListener2 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {//获得一些资源 返回一个对象TextField field = (TextField) e.getSource();//获取输入框的文本System.out.println(field.getText());//设置为空字符串field.setText("");}
}

2.7 简易计数器

初始版本

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TestCalc {public static void main(String[] args) {new Calculator();}
}//计算器类
class Calculator extends Frame{public Calculator(){TextField num1 = new TextField(10);TextField num2 = new TextField(10);TextField sum = new TextField(20);Button button = new Button("Calc");button.addActionListener(new MyCalculatorListener(num1,num2,sum));Label label1 = new Label("+");Label label2 = new Label("=");setLayout(new FlowLayout());add(num1);add(label1);add(num2);add(label2);add(sum);add(button);pack();setVisible(true);exit();}private void exit(){addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}//监听器类
class MyCalculatorListener implements ActionListener{private TextField num1,num2,sum;public MyCalculatorListener(TextField num1,TextField num2,TextField sum){this.num1=num1;this.num2=num2;this.sum=sum;}@Overridepublic void actionPerformed(ActionEvent e) {int n1 = Integer.parseInt(num1.getText());int n2 = Integer.parseInt(num2.getText());int n3=n1+n2;sum.setText(String.valueOf(n3));num1.setText("");num2.setText("");}
}

改造为面向对象

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TestCalc {public static void main(String[] args) {new Calculator().loadFrame();}
}//计算器类
class Calculator extends Frame {TextField num1, num2, sum;public void loadFrame() {num1 = new TextField(10);num2 = new TextField(10);sum = new TextField(20);Button button = new Button("Calc");Label label1 = new Label("+");Label label2 = new Label("=");button.addActionListener(new MyCalculatorListener(this));setLayout(new FlowLayout());add(num1);add(label1);add(num2);add(label2);add(sum);add(button);pack();setVisible(true);exit();}private void exit() {addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}//监听器类
class MyCalculatorListener implements ActionListener {//获取计算机这个对象,在一个类中组合另一个类Calculator calculator = null;public MyCalculatorListener(Calculator calculator) {this.calculator = calculator;}@Overridepublic void actionPerformed(ActionEvent e) {int n1 = Integer.parseInt(calculator.num1.getText());int n2 = Integer.parseInt(calculator.num2.getText());calculator.sum.setText(String.valueOf(n1 + n2));calculator.num1.setText("");calculator.num2.setText("");}
}

改造为内部类

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TestCalc {public static void main(String[] args) {new Calculator().loadFrame();}
}//计算器类
class Calculator extends Frame {TextField num1, num2, sum;public void loadFrame() {num1 = new TextField(10);num2 = new TextField(10);sum = new TextField(20);Button button = new Button("Calc");Label label1 = new Label("+");Label label2 = new Label("=");button.addActionListener(new MyCalculatorListener());setLayout(new FlowLayout());add(num1);add(label1);add(num2);add(label2);add(sum);add(button);pack();setVisible(true);exit();}private void exit() {addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}//监听器类//内部类最大的好长就是可以畅通无阻的访问外部类的属性和方法private class MyCalculatorListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {int n1 = Integer.parseInt(num1.getText());int n2 = Integer.parseInt(num2.getText());sum.setText(String.valueOf(n1 + n2));num1.setText("");num2.setText("");}}
}

2.8 画笔

每个Component都有一个paint(Graphics g)用于实现绘图目的,每次重画该Component时都自动调用paint方法。

import java.awt.*;public class TestPaint {public static void main(String[] args) {//在main()方法里面并没有显示调用paint(Graphics g)方法new MyPaint().loadFrame();}
}class MyPaint extends Frame {public void loadFrame(){setBounds(200,200,600,400);setVisible(true);}@Overridepublic void paint(Graphics graphics){graphics.setColor(Color.red);graphics.drawOval(100,100, 100,100);graphics.fillOval(200,100,100,100);graphics.setColor(Color.BLUE);graphics.fillRect(100,200,100,100);// 养成习惯,画笔用完 还原为最初的颜色graphics.setColor(Color.BLACK);}
}

2.9 鼠标监听事件

抽象类java.awt.event.MouseAdapter实现了MouseListener接口,可以使用其子类作为MouseEvent的监听器,只要重写其相应的方法即可。

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;public class TestMouseListener {public static void main(String[] args) {new MyFrame("画图");}
}class MyFrame extends Frame {//存储坐标private ArrayList points;//画画需要画笔,需要监听鼠标当前位置,需要集合来存储这个点public MyFrame(String title){super(title);setVisible(true);setBounds(200,200,400,300);//存储坐标points=new ArrayList<>();//鼠标监听器,对这个窗口addMouseListener(new MyMouseListener());}@Overridepublic void paint(Graphics g) {//画画,监听鼠标的事件Iterator iterator = points.iterator();while(iterator.hasNext()){Point point = (Point) iterator.next();g.setColor(Color.BLUE);g.fillOval(point.x,point.y,10,10);}}public void addPaint(Point point){points.add(point);}private class MyMouseListener extends MouseAdapter {//鼠标按压@Overridepublic void mousePressed(MouseEvent e) {//获取被监听的对象MyFrame myFrame =(MyFrame) e.getSource();//鼠标的坐标myFrame.addPaint( new Point(e.getX(),e.getY()));//每次点击鼠标都需要重新画一次myFrame.repaint();//刷新}}
}

2.10 窗口监听

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TestWindow {public static void main(String[] args) {new WindowFrame();}
}
class WindowFrame extends Frame {public WindowFrame(){setBackground(Color.pink);setBounds(100,100,200,200);setVisible(true);//addWindowListener(new MyWindowListener());//使用内部类addWindowListener(new WindowAdapter() {//关闭窗口@Overridepublic void windowClosing(WindowEvent e) {System.out.println("退出");System.exit(0);}//激活窗口@Overridepublic void windowActivated(WindowEvent e) {WindowFrame frame =(WindowFrame) e.getSource();frame.setTitle("被激活");System.out.println("windowActivated");}});}class MyWindowListener extends WindowAdapter{@Overridepublic void windowClosing(WindowEvent e) {//隐藏窗口setVisible(false);System.exit(0);//正常退出}}
}

2.11 键盘监听

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;public class TestKeyListener {public static void main(String[] args) {new KeyFrame();}
}class KeyFrame extends Frame {public KeyFrame(){setBounds(100,100,200,200);setVisible(true);addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {//KeyEvent.VK_UP表示取得up键的虚拟码//键盘中的每一个键都对应有一个虚拟码这些虚拟码在KeyEvent类里面都被定义为静态常量//使用“类名.静态常量名”的形式访问得到这些静态常量System.out.println(e.getKeyCode());//获取键盘的码if ( e.getKeyCode()==KeyEvent.VK_UP){System.out.println("按下了上键");}}});}
}

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

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

相关文章

港联证券|4连板的AI+传媒概念股火了,近5亿资金抢筹

今天&#xff0c;沪深两市共51股涨停&#xff0c;除掉10只ST股&#xff0c;合计41股涨停。别的&#xff0c;11股封板未遂&#xff0c;全体封板率为81%。 涨停战场&#xff1a;长江传媒封单量最高 从收盘涨停板封单量来看&#xff0c;长江传媒封单量最高&#xff0c;有39.96万手…

Linux 内存管理 pt.2

哈喽大家好我是咸鱼&#xff0c;在《Linux 内存管理 pt.1》中我们学习了什么是物理内存、虚拟内存&#xff0c;了解了内存映射、缺页异常等内容 那么今天我们来接着学习 Linux 内存管理中的多级页表和大页 多级页表&大页 在《Linux 内存管理 pt.1》中我们知道了内核为每…

【linux的学习与软件安装】

文章目录 linux的学习一、工具安装与联网&#xff1f;二、Linux软件安装1.安装jdk2.安装MySQL安装redis linux的学习 一、工具安装与联网&#xff1f; 1.1安装好VM后 进入vi /etc/sysconfig/network-scripts/ifcfg-ens33 然后ip addr 查看ip 1.2打开IDEA的tools 二、Linux软…

uniapp - 实现微信小程序电子签名板,横屏手写姓名签名专用写字画板(详细运行示例,一键复制开箱即用)

效果图 实现了在uniapp项目中,微信小程序平台流畅的写字签名板(也可以绘图)功能源码,复制粘贴,改改样式几分钟即可搞定! 支持自动横屏、持预览,真机运行测试非常流畅不卡顿。 基础模板 如下代码所示。 <template><view class=

Shell脚本2

自定义局部变量 :定义在一个脚本文件中的变量 只能在这个脚本文件中使用的变量&#xff0c;局部变量 语法&#xff1a; var_namevalue 变量定义规则 变量名称可以有字母,数字和下划线组成, 但是不能以数字开头 等号两侧不能有空格 在bash环境中, 变量的默认类型都是字符串…

Softing线上研讨会 | 轻松访问XML文件中的过程数据

| 线上研讨会时间&#xff1a;2023年5月8日下午4点或晚上10点 对于传统车间的系统应用和创新的物联网解决方案而言&#xff0c;高效访问机器和流程数据至关重要。而在现有工厂中&#xff0c;过程数据通常以XML文件的形式出现。对此&#xff0c;Softing Industrial提供了一个用…

【华为OD机试 2023最新 】箱子之字形摆放(C语言题解 100%)

文章目录 题目描述输入描述输出描述备注用例题目解析C语言题目描述 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为: AFG BE C…

2023年房地产抵押贷款研究报告

第一章 概述 房地产抵押贷款是一种以房地产为抵押品的贷款形式&#xff0c;包括个人和企业两种情况。个人房地产抵押贷款是指个人将名下房产作为抵押品向银行或其他金融机构申请贷款&#xff0c;而企业房地产抵押贷款则是指企业将自己名下的商业房产作为抵押品向金融机构申请贷…

2-Lampiao百个靶机渗透(精写-思路为主)框架漏洞利用2

特别注明&#xff1a;本文章只用于学习交流&#xff0c;不可用来从事违法犯罪活动&#xff0c;如使用者用来从事违法犯罪行为&#xff0c;一切与作者无关。 文章目录 前言一、环境重新部署二、AWVSxray联动和xraybs联动1.安装AWVSxray2.让xray和bs先联动3.AWVS和xray联动 三、p…

多城市门店店铺展示地图导航pc/h5系统开发

多城市门店店铺展示地图导航pc/h5系统开发 系统设置&#xff1a; 网站标题、网站副标题、Logo图、网站背景图、网站底部图、网站底部版权、网站ICP备案、腾讯地图Key。 店铺列表&#xff1a; 店铺名称、店铺图标、设备、电话、省市区、详细地址。 添加店铺&#xff1a; 店铺…

Kubernetes服务搭建[配置-部署](Kubeadm)

文章目录 **[1 — 7] ** [ 配置K8S主从集群前置准备操作 ]一&#xff1a;主节点操作 查看主机域名->编辑域名1.1 编辑HOST 从节点也做相应操作1.2 从节点操作 查看从节点102域名->编辑域名1.3 从节点操作 查看从节点103域名->编辑域名 二&#xff1a;安装自动填充&…

【Linux】usb游戏手柄测试、编程

1、简述 在ubuntu18.04下使用usb游戏手柄,之前联系客服,客服回答不清楚是否支持linux,因此采购一款北通蝙蝠2的手柄来测试 2、测试 2.1 测试环境 系统:Ubuntu18.04 正常电脑系统ubuntu中都是自带手柄驱动的joystick,即内核配置已添加选项:Joysticks interface和Joys…

看我如何通过帮助服务台轻松黑掉数百家公司

导语&#xff1a;几个月前&#xff0c;我发现黑客可以利用一个漏洞访问目标公司的内部通信。 这个漏洞只需要点击几下&#xff0c;就可以访问企业内部网络、 Twitter等社交媒体账户&#xff0c;以及最常见的Yammer和Slack团队。 更新: The Next Web 写了一篇我发现的这个漏洞的…

读书笔记——《2001太空漫游》

阿瑟克拉克神作&#xff0c;任何一个科幻迷都绕不开的一部作品。很早就听说过其大名&#xff0c;因为之前看过电影版的&#xff0c;总感觉少了点新鲜感&#xff0c;这本书就一直在书架上没有拿出来看。但是看过这本书后&#xff0c;我可以很负责任的说&#xff0c;全书都充满新…

【Android入门到项目实战-- 9.1】—— 传感器的使用教程

目录 传感器的定义 三大类型传感器 1、运动传感器 2、环境传感器 3、位置传感器 传感器开发框架 1、SensorManager 2、Sensor 3、SensorEvent 4、SensorEventListener 一、使用传感器开发步骤 1、获取传感器信息 1)、获取传感器管理器 2)、获取设备的传感器对象列…

Oracle数据库、实例、用户、表空间、表之间的关系

数据库&#xff1a; Oracle数据库是数据的物理存储。这就包括&#xff08;数据文件ORA或者DBF、控制文件、联机日志、参数文件&#xff09;。其实Oracle数据库的概念和其它数据库不一样&#xff0c;这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库。…

如何利用问卷工具助力活动开展,实现高效数据收集?

问卷调查是一种常用的活动开展方式&#xff0c;它可以帮助我们更好地了解参与者的需求和意见&#xff0c;为活动的开展提供有力的参考和依据。 1、了解期望和需求&#xff1a;在活动中&#xff0c;我们可以事先通过问卷调查了解参与者的需求、意见、对活动的需求和期望&#x…

2023年6月DAMA-CDGA/CDGP数据治理认证报名请尽早啦!

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中&#xff01; 考试开放地区&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证开班时间&#xff1a;5月7日 DAMA认证为数据管理专业人士提供…

嵌入式设备逆向所需的工具链

导语&#xff1a;本文介绍了嵌入式设备逆向所需的工具链。 相关的应用程序或工具有&#xff1a; UART(Universal Asynchronous Receiver Transmitter&#xff0c;通用异步收发器)&#xff1a; UBoot&#xff1b; Depthcharge&#xff1b; SPI (Serial Peripheral Interface…

SpringCloud全面学习笔记之初窥门径篇

目录 前言Docker初见小鲸鱼Docker架构Docker的安装Docker基操Dockerfile自定义镜像Docker-ComposeDocker镜像仓库 异步通信初识MQ同步通讯异步通讯MQ常见框架 RabbitMQ快速入门RabbitMQ概述和安装常见消息模型快速入门 SpringAMQPBasic Queue 简单队列模型Work Queue 工作队列模…