GUI编程(函数解析以及使用)

news2025/1/31 8:07:43

1.介绍

AWT(Abstract Window Toolkit)和Swing 是 Java 提供的用于创建图形用户界面(GUI)的类库。

  1. AWT:AWT 是 Java 最早提供的 GUI 类库,它基于本地平台的窗口系统,使用操作系统的原生组件进行界面渲染。AWT 提供了一系列的类和方法,用于创建窗口、按钮、文本框等 GUI 组件,并处理用户事件。AWT 的组件和事件模型与底层平台密切相关,因此在不同的平台上可能会有差异。

  2. Swing:Swing 是建立在 AWT 之上的一个 GUI 类库,它完全由 Java 编写,不依赖于底层平台。Swing 提供了一套丰富的可定制的轻量级组件,如 JFrame、JButton、JTextField 等,并且具有更好的外观和跨平台的一致性。Swing 的组件和事件模型相对于 AWT 更加灵活,可以自定义绘制和样式。

区别:

  • 组件外观:AWT 使用本地平台的原生组件,而 Swing 使用纯 Java 实现的组件。因此,Swing 组件的外观更加统一,并且可以自定义绘制和样式,而 AWT 组件外观受限于本地平台。

  • 跨平台性:由于 Swing 是纯 Java 实现的,它的外观和行为在不同平台上是一致的,而 AWT 的外观和行为可能因平台而异。

  • 功能扩展:Swing 提供了更多的组件和功能,例如树状组件、表格组件等。同时,Swing 也支持更多的布局管理器,可以实现更复杂的界面布局。

关于 Frame 和 JFrame:

  • Frame:Frame 是 AWT 中的一个顶层窗口类,继承自 Window 类。它是一个简单的窗口容器,可以用来创建应用程序的主窗口。Frame 可以包含其他的组件,如按钮、文本框等。

  • JFrame:JFrame 是 Swing 中的一个顶层窗口类,继承自 Frame 类。JFrame 拥有更丰富的特性和功能,例如可自定义的标题栏、菜单栏、工具栏等。同时,JFrame 也支持 Swing 的 Look and Feel,可以统一外观,并且可以进行更灵活的界面定制。

总体上,AWT 是 Java 最早的 GUI 类库,基于本地平台的原生组件,而 Swing 是建立在 AWT 之上的一套完全由 Java 实现的 GUI 类库,提供了更丰富的组件和功能,同时具备跨平台性和可定制性。Frame 是 AWT 的顶层窗口类,而 JFrame 是 Swing 的顶层窗口类,JFrame 比 Frame 提供了更多的特性和功能。

总结:AWT是基础,Swing是以AWT为基础的GUI类库。基本上就是以学习Swing为主了。

但是这并不意味着不用学AWT了,先学AWT有了基础之后,学Swing事半功倍。

2.AWT(abstract windows tool)

抽象窗口工具

1.包含了很多类和接口。

2.元素:窗口,按钮,文本框

3.包是java.awt

Frame的使用

简单的创建一个窗户

public class TestGUI {
	
	public static void main(String[] args) {
		Frame frame= new Frame("java图形界面窗口");
        //窗口是Frame类
		
		 //需要设置可见性
		frame.setVisible(true);
		
		//设置窗口大小
		frame.setSize(400,400);
		
		
		//设置背景颜色
		frame.setBackground(new Color(85,150,68));//r,g,b

		
		//弹出的初始位置
		frame.setLocation(200,200);
		
		
		//设置窗口大小固定
		frame.setResizable(false);
        //false是不可以改变
        //不写的话默认为true,可改变
		
		
		
		
	}

想创建一个窗口要写这么多代码,很麻烦,我们可以自己写一个类继承Frame,然后写一些方法,便于创造多个窗口

class MyFrame extends Frame{
	static int id = 0;//可能存在多个窗口,我们需要一个计数器
	
	public MyFrame(int x,int y,int w,int h,Color c) {
		super("MyFrame"+(++id));//调用父类的构造方法
		setBackground(c);
		
		setBounds(x,y,w,h);//等同于setLocation和setSize的结合
		setVisible(true);
		
	}
	
	
}

public class TestGUI {
	
	public static void main(String[] args) {
		MyFrame f1 = new MyFrame(100,100,200,200,Color.blue);
		MyFrame f2 = new MyFrame(100,100,200,200,Color.black);
		MyFrame f3 = new MyFrame(100,100,200,200,Color.cyan);
		MyFrame f4 = new MyFrame(100,100,200,200,Color.green);
		MyFrame f5 = new MyFrame(100,100,200,200,Color.red);
		
		
		
	}
	
	
	
}

面板Panel

Panel可以看成是一个空间,但是不能单独存在,需要内嵌在Frame里、

以下代码实现内嵌panel,还有创建一个监听事件->监听窗口关闭事件

public class TestGUI {
	
	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(new Color(40,161,35));
		
		//设置panel坐标(相对于frame)
		panel.setBounds(50,50,400,400);
		panel.setBackground(new Color(193,15,60));
		
		
		//在frame中加入该面板
		frame.add(panel);
		
		frame.setVisible(true);
		


        //创建一个监听事件->监听窗口关闭事件 System.exit(0)

        //这种写法显然太臃肿了,要重写所有方法
        //但我们现在只想关闭窗口,所以只需要windowClosing这个方法
        /*frame.addWindowListener(new WindowListener() {
			
			@Override
			public void windowOpened(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void windowIconified(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void windowDeiconified(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void windowDeactivated(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void windowClosed(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void windowActivated(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
		});*/
		

        //因此我们可以用,适配器模式,只对我们需要的方法进行重写
        frame.addWindowListener(new WindowAdapter() {

			@Override
			//在这个方法里写,窗口关闭的时候要做的事情
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
			
		});


		
	}
	
	
	
}

适配器模式

布局管理器

有以下几种布局

  • 流式布局(FlowLayout)
  • 边界布局(BorderLayout),也叫东西南北中
  • 表格布局(GridLayout)

这里引入Button,来体现布局

流式布局

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	Frame frame = new Frame();
		frame.setVisible(true);
		frame.setBounds(400,400,400,400);
		frame.setBackground(Color.GREEN);
		frame.setLayout(new FlowLayout(FlowLayout.CENTER));//可以选择左右上下中
		
		Button b1 = new Button("b1");
		Button b2 = new Button("b2");
		Button b3 = new Button("b3");
		Button b4 = new Button("b4");
		Button b5 = new Button("b5");
		
		frame.add(b1);
		frame.add(b2);
		frame.add(b3);
		frame.add(b4);
		frame.add(b5);
    }
}

边界布局

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	Frame frame = new Frame("TestBorderLayout");
		frame.setVisible(true);
		frame.setBounds(400,400,400,400);
		frame.setBackground(Color.GREEN);
		
		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(center,BorderLayout.CENTER);
		frame.add(east,BorderLayout.EAST);
		frame.add(west,BorderLayout.WEST);
		frame.add(north,BorderLayout.NORTH);
		frame.add(south,BorderLayout.SOUTH);
		
    }
}

表格布局(GridLayout)

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	Frame frame = new Frame("TestBorderLayout");
		frame.setVisible(true);
		frame.setBounds(400,400,400,400);
		frame.setBackground(Color.GREEN);
		
		Button b1 = new Button("b1");
		Button b2 = new Button("b2");
		Button b3 = new Button("b3");
		Button b4 = new Button("b4");
		Button b5 = new Button("b5");
		Button b6 = new Button("b6");
		
		frame.setLayout(new GridLayout(3,2));//核心代码
		
		frame.add(b1);
		frame.add(b2);
		frame.add(b3);
		frame.add(b4);
		frame.add(b5);
		frame.add(b6);
		
		//frame.pack();//自动填充,也可以不用
    }
}

总结练习

设计下图窗口

package demo;
import java.util.*;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.Random;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.border.Border;

import java.awt.*;
import java.awt.*;
import java.awt.event.*;

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	Frame frame = new Frame("ExDemo");
		frame.setVisible(true);
		frame.setBounds(400,400,800,500);
		
		frame.setLayout(new GridLayout(2,1));
		
		//先写上面的
		Panel p1 = new Panel(new BorderLayout());
		//要用边界布局,后续在p1里布置东,西,中
		Panel p2 = new Panel(new GridLayout(2,1));
		
		p1.add(new Button("west-1"),BorderLayout.WEST);
		p1.add(new Button("east-1"),BorderLayout.EAST);
		p2.add(new Button("p2-btn-1"));
		p2.add(new Button("p2-btn-2"));
		p1.add(p2,BorderLayout.CENTER);
		
		
		//再写下面的
		Panel p3 = new Panel(new BorderLayout());
		Panel p4 = new Panel(new GridLayout(2,2));
		p3.add(new Button("west-2"),BorderLayout.WEST);
		p3.add(new Button("east-2"),BorderLayout.EAST);
		
		for(int i = 1;i<=4;i++) {
			p4.add(new Button("p4-btn-"+i));
		}
		p3.add(p4,BorderLayout.CENTER);
		
		
		frame.add(p1);
		frame.add(p3);
    }
}




事件监听

3.Swing

JFrame

JFrame:JFrame 是 Swing 中的一个顶层窗口类,继承自 Frame 类。

这意味着Frame的操作和方法基本在JFrame都能用,但有些还是有所区别的。

例如:Frame可以用setBackground设置背景颜色,而JFrame不行,

在Swing中,JFrame是继承自Frame的顶层窗口组件,但是它重写了父类Frame的设置背景颜色的方法。在JFrame中并没有提供直接设置背景颜色的方法,因为Swing更多地依赖于Look and Feel和视觉外观管理器(UIManager)来控制组件的外观和感觉。因此,想要设置JFrame的背景颜色,通常需要使用其他组件或技术来实现,比如在contentPane上添加一个背景色为指定颜色的面板。

接下来开始正式介绍了

构造方法

无参构造

JFrame jf = new JFrame();

jf.setTitle("TestJF");

有参构造

JFrame jf = new JFrame("TestJF");

无参构造可以配合setTitle来设置标题

参数设置及常用方法


setTitle("窗体名称");
用来设置窗口名字

setSize(int width, int height);
这个方法用来设置窗体的大小,传入宽高即可。

setLocation(int x, int y);
这个方法用来设置窗体的坐标(原点在左上角),传入坐标即可。

setBounds(int x, int y, int width, int height);
看这玩意的参数你就大概猜得到,没错它就是上面②和①的整合版。

setVisible(boolean b);
用来设置窗体是否可见,默认是不可见的,所以要可见必须用这个方法传入参数true。

setDefaultCloseOperation(int opreation);
用来设置点击窗体关闭按钮的时候,做出的响应。通常都是如下面这样写(调用WindowConstants这个类中的静态成员EXIT_ON_CLOSE,表示点击关闭按钮时的默认响应为关闭此窗口并结束程序)。

fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


WindowConstants的相关静态成员如下:

DO_NOTHING_ON_CLOSE(什么也不做)
HIDE_ON_CLOSE (隐藏当前窗口)
DISPOSE_ON_CLOSE (隐藏当前窗口,并释放窗体占有的其他资源,这个重点记一下,后面讲JDialog会用到)
EXIT_ON_CLOSE (结束窗口所在的应用程序)。
 

例题

创建一个窗口

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	JFrame jf = new JFrame("TestJF");
    	jf.setBounds(400,400,400,400);
    	jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	jf.setVisible(true);
    	
    }
}

JDialog

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	JFrame jf = new JFrame("TestJF");
    	jf.setTitle(null);
    	jf.setVisible(true);
    	jf.setBounds(400,400,400,400);
    	jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	
    	
    	JDialog jd = new JDialog(jf,"TestJD");
    	
    	jd.setBounds(450,450,100,100);
    	jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

    	jd.setModal(true);//设置模态窗口
    	
    	jd.setVisible(true);
    }
}

JPanel

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	JFrame jf = new JFrame("Test");
    	jf.setBounds(400,400,400,400);
    	jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	jf.setVisible(true);
    	
    	JPanel p = new JPanel();
    	
    	JButton b1 = new JButton("b1");
    	JButton b2 = new JButton("b2");
    	JButton b3 = new JButton("b3");
    	JButton b4 = new JButton("b4");
    	
    	p.add(b1);p.add(b2);p.add(b3);p.add(b4);
    	jf.add(p);
    	
    }
}

JScrollPanel

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	JFrame jf = new JFrame("Test");
    	jf.setBounds(400,400,400,400);
    	jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	jf.setVisible(true);
    	
    	JPanel p = new JPanel();
    	
    	JButton b1 = new JButton("b1");
    	JButton b2 = new JButton("b2");
    	JButton b3 = new JButton("b3");
    	JButton b4 = new JButton("b4");
    	
    	p.add(b1);p.add(b2);p.add(b3);p.add(b4);
    	jf.add(p);
    	
    	JScrollPane jsp = new JScrollPane();
    	jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    	jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    	
    	jsp.setViewportView(p);
    	jf.add(jsp);
    	
    }
}

JLabel

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	JFrame jf = new JFrame("Test");
    	jf.setBounds(400,400,400,400);
    	jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	jf.setVisible(true);
    	
    	JPanel p = new JPanel();
    	JLabel label = new JLabel("插入标签");
    	
    	p.add(label);
    	jf.add(p);
    	
    	
    	
    }
}

JTextField

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	JFrame jf = new JFrame("Test");
    	jf.setBounds(400,400,500,500);
    	jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	jf.setVisible(true);
    	
    	JPanel p = new JPanel();
    	JTextField jt = new JTextField(40);//设置文本框列数,也就是设置长度
    	
    	p.add(jt);
    	jf.add(p);
    	
    	
    	
    }
}

JTextArea

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    	JFrame jf = new JFrame("Test");
    	jf.setBounds(400,400,500,500);
    	jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	jf.setVisible(true);
    	
    	JPanel p = new JPanel();
    	JTextArea jt = new JTextArea(5,20);//设置文本框列数,也就是设置长度
    	
    	p.add(jt);
    	jf.add(p);
    	
    	
    	
    }
}

JButton

跟AWT的Button没什么区别,不赘述了

例题

public class Main {
    public static void createGUI() {
        JFrame fr = new JFrame("这是主窗口");//通常直接在有参构造的时候命名,省得后续用setTitle()方法命名了。
        fr.setSize(400, 250);//设置窗体宽高
        fr.setLocation(400, 300);//设置窗体坐标
        
        fr.setVisible(true);//设置窗体可见,基本必写吧?
        fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭按钮响应事件为关闭此窗口。
 
        //以下是重点
        JPanel pane = new JPanel();
        JLabel label = new JLabel("请输入:");
        JTextField textField = new JTextField(20);
        JButton button = new JButton("发送");
        pane.add(label);
        pane.add(textField);
        pane.add(button);
        //把容器放在窗口中
        fr.add(pane);
    }
 
    public static void main(String[] args) {
        createGUI();
    }
}

事件监听和处理

重点掌握:实现ActionListener这个接口,并重写其中的actionPerformed方法(这个方法就固定接收一个ActionEvent类)

例如:

class my_listenr implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent e) {//传入的参数是事件
		// TODO Auto-generated method stub
		System.out.println("按钮被点击");
	}
	
}

例题

实现一个功能,点击按钮,会输出“按钮被点击”.

方法一:自定义类实现

class my_listenr implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent e) {//传入的参数是监听事件
		// TODO Auto-generated method stub
		System.out.println("按钮被点击");
	}
	
}

public class Main {
    public static void createGUI() {
        JFrame fr = new JFrame("这是主窗口");//通常直接在有参构造的时候命名,省得后续用setTitle()方法命名了。
        fr.setSize(400, 250);//设置窗体宽高
        fr.setLocation(400, 300);//设置窗体坐标
        
        fr.setVisible(true);//设置窗体可见,基本必写吧?
        fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭按钮响应事件为关闭此窗口。
 
        JPanel p = new JPanel();
        JButton b = new JButton("按钮");
        b.addActionListener(new my_listenr());
        p.add(b);fr.add(p);
        
    }
 
    public static void main(String[] args) {
        createGUI();
    }
}

方法二:匿名内部类实现

实际上,每个按钮的功能一般都不一样,如果有多个按钮,用方法一的话就要自定义多个类,太冗余了,因此我们可以用匿名内部类实现。

对这个知识点不熟悉的可以看-> 匿名内部类

public class Main {
    public static void createGUI() {
        JFrame fr = new JFrame("这是主窗口");//通常直接在有参构造的时候命名,省得后续用setTitle()方法命名了。
        fr.setSize(400, 250);//设置窗体宽高
        fr.setLocation(400, 300);//设置窗体坐标
        
        fr.setVisible(true);//设置窗体可见,基本必写吧?
        fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭按钮响应事件为关闭此窗口。
 
        JPanel p = new JPanel();
        JButton b = new JButton("按钮");

        //匿名内部类实现
        b.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println("按钮被点击");
			}
		});
        p.add(b);fr.add(p);
        
    }
 
    public static void main(String[] args) {
        createGUI();
    }
}

效果与方法一相同

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

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

相关文章

git 中分支的概念及使用

git 中分支的概念及使用 分支模型是 Git 中的 “必杀技特性”&#xff0c; Git 处理分支的方式非常轻量&#xff0c;创建新分支这一操作几乎能在瞬间完成&#xff0c;并且在不同分支之间的切换操作也是一样便捷。 理解和精通这一特性&#xff0c;我们便会意识到 Git 是如此的强…

使用mamba替换conda和anaconda配置环境安装软件

使用mamba替换miniconda和anaconda&#xff0c;原因是速度更快&#xff0c;无论是创建新环境还是激活环境 conda、mamba、anaconda都是蟒蛇的意思… 下载mambaforge wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh ba…

浅谈项目周报的核心要点

相信很多朋友都写过周报&#xff0c;无论什么岗位&#xff0c;而其中项目周报对于项目管理人员极其重要&#xff0c;项目周报是一种重要的沟通工具&#xff0c;用于向相关人员汇报项目的进展情况、存在的问题和下一周的工作计划。以下是一些关于如何编写项目周报的核心要点&…

SpringBoot 入门 SpringBoot 与其他项目整合 集成 Druid 数据库连接池 集成 Log 日志 配置修改

目录 1.SpringBoot简介 1.1.什么是SpringBoot 1.2.特点 2.SpringBoot快速入门 2.1.创建SpringBoot项目 2.2.项目目录介绍 2.3.配置修改 2.4.启动SpringBoot 3.SpringBoot与其他项目整合 3.1.整合JDBC 3.2.整合Druid数据库连接池 3.3.整合MyBatis 3.4.整合Log日志 …

【Kafka-3.x-教程】-【六】Kafka 外部系统集成 【Flume、Flink、SpringBoot、Spark】

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

TLC Nand Flash 存储单元的读取原理

我们知道Nand Flash使用浮栅晶体管作为存储单元&#xff08;memory cell&#xff09;来存储数据&#xff0c;浮栅晶体管物理结构如图1所示&#xff1a; 图1 浮栅晶体管 对于普通的晶体管&#xff08;去掉浮栅晶体管中的浮栅层&#xff0c;floating gate&#xff09;&#xff0…

Redis数据缓存

缓存 一 缓存基础 1 缓存的概念和作用 缓存就是数据交换的缓冲区&#xff08;称作Cache&#xff09;&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高 2 缓存的使用 之前没有使用缓存是的模型 3 项目说明 当我们查询商家信息的时候&#xff0c;直接从mysql中…

FFmpeg 的使用与Docker安装流媒体服务器

本文阐述的均为命令行的使用方式&#xff0c;并不牵扯FFmpeg 的 C音视频开发内容&#xff0c;补充一句&#xff0c;C的资料真的少&#xff0c;能把C学好的人&#xff0c;我真的是觉得巨佬。 我主要是使用FFmpeg 推流方面的知识&#xff0c;案例大都是靠近这方面。 一、FFmpeg…

寻找最富裕的小家庭 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 在一棵树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭现给你一棵树,请计算出最富裕的小家庭的财富和。 输入描述 第一行为一个数N,…

系列十、Spring Security登录接口添加验证码

一、Spring Security登录接口添加验证码 1.1、概述 一般企业开发中&#xff0c;登录时都会有一个验证码&#xff0c;基于Spring Security的登录接口默认是没有验证码的&#xff1f;那么如何把验证码功能集成到Spring Security的登录接口呢&#xff1f;请看下文&#xff01; 1.…

SpringBoot视图渲染技术:整合Freemarker,常见指令和数据类型

目录 1.Freemarker 1.1.什么是Freemarker 1.2.Freemarker模板组成部分 1.3.优点 2.SpringBoot整合Freemarker 2.1.配置 2.2.数据类型 2.2.1.字符串 2.2.2.数值 2.2.3.布尔值 2.2.4.日期 2.3.常见指令 2.3.1.处理不存在的值 2.3.2.assign 2.3.3.if/elseif/else …

物联网中的通信技术

阅读引言&#xff1a; 本文主要大致为大家带来物联网中的常见的通信方式的知识梳理。 目录 一、概述 二、无线通信技术 1.物联网电子标签 RFID 1.1 RFID 概念 1.2 RFID 系统组成 2.WI-FI技术 3.UWB技术 4.ZigBee技术 5.NFC技术 6.蓝牙技术 7.EnOcean技术 一、概述 物…

ssm基于VUE.js的在线教育系统论文

摘 要 随着学习压力越来越大&#xff0c;课外参加补习班的学生越来越多。现在大多数学生采用请家教、自学、报名补习班的方式进行课外的额外学习。请家教费用昂贵&#xff0c;自学效率低&#xff0c;碰到自己不会的知识不能及时得到解达&#xff0c;报名补习班需要时间、地点的…

VBA技术资料MF106:检查单元格是否在表对象中

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

Java中的包机制、final和super关键字

一、包机制 关于java语言当中的包机制&#xff1a; 1.包又被称为package,java中引入package这种语法机制主要是为了方便程序的管理。 不同功能的类被分门别类放到不同的软件包当中&#xff0c;查找比较方便&#xff0c;管理比较方便&#xff0c;易维护。 2.怎么定义package呢…

第 4 课 创建工作空间与功能包

文章目录 第 4 课 创建工作空间与功能包1.工作环境的创建2.ROS功能包的创建 第 4 课 创建工作空间与功能包 消息和服务的创建、发布器和订阅器的编写、服务端和客户端的编写都是基于Ros功能包进行操作的&#xff0c;因此在进行上述操作前&#xff0c;需要先创建工作空间及功能包…

基于Springboot的网上点餐系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的网上点餐系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&am…

【Java学习】Java环境变量——配置jdk

本文我主要是介绍jdk的下载方式和在Windows系统下安装配置jdk11&#xff08;压缩包格式&#xff09;&#xff0c;其他格式的jdk以及Linux操作系统上的jdk安装我后续视情况进行更新… JDK的下载 大家可以去官网Java|Oracle下载对应的资源&#xff0c;也可以下载文末我上传的jd…

8 - MySQL数据读写分离|MySQL多实例

MySQL数据读写分离&#xff5c;MySQL多实例 MySQL数据读写分离数据读写分离如何实现数据的读写分离提供数据读写分离服务的软件&#xff08;中间件&#xff09;maxscale 软件提供的读写分离服务的工作过程配置数据读写分离结构 提供数据存储服务 MySQL多实例 MySQL数据读写分离…

最新国内可用GPT4、Midjourney绘画、DALL-E3文生图模型教程

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…