当前位置: 首页 > news >正文

GUI编程(二)

Swing

Swing是GUI(图形用户界面)开发工具包。

早期的AWT(抽象窗口工具包)组件开发的图形用户界面,要依赖本地系统,当把AWT组件开发的应用程序移植到其他平台的系统上运行时,不能保证其外观风格,因此AWT是依赖于本地系统平台的。

而使用Swing开发的Java应用程序,其界面是不受本地系统平台限制的,也就是说Swing开发的Java应用程序移植到其他系统平台上时,其界面外观是不会改变的。但要注意的是,虽然Swing提供的组件可以方便开发Java应用程序,但是Swing并不能取代AWT,在开发Swing程序时通常要借助与AWT的一些对象来共同完成应用程序的设计。

一、常用窗体

Swing窗体是Swing的一个组件,同时也是创建图形化用户界面的容器,可以将其它组件放置在窗体容器中。

1. JFrame框架窗体

JFrame窗体是一个容器,在Swing开发中我们经常要用到,它是Swing程序中各个组件的载体。

这里我们要把组件添加到容器container 中,而不是像Frame一样直接添加到frame中

package com.demo4;import javax.swing.*;
import java.awt.*;public class TestJFrame {public void init(){//顶级窗口JFrame frame = new JFrame("JFrame");frame.setVisible(true);frame.setBounds(100,100,200,200);//设置文字JLabel label = new JLabel("Hello");//文本标签居中label.setHorizontalAlignment(JLabel.CENTER);// 获取一个容器Container container = frame.getContentPane();// 将标签添加至容器container.add(label);// 设置容器背景颜色container.setBackground(Color.pink);//关闭事件frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {//建立一个窗口new TestJFrame().init();}
}

常用的窗体关闭方式有四种:
“DO_NOTHING_ON_CLOSE” :什么也不做就将窗体关闭;
“DISPOSE_ON_CLOSE” :隐藏当前窗口,并释放窗体占有的其他资源。
“HIDE_ON_CLOSE” : 隐藏窗口的默认窗口关闭;
“EXIT_ON_CLOSE”:退出应用程序默认窗口关闭。

DISPOSE_ON_CLOSE在窗口被关闭的时候会dispose这个窗口。
如果你的程序没有其他线程在运行的话,当所有的窗口都被dispose了之后,JVM也会退出。
1.setDefaultCloseOperation(DISPOSE_ON_CLOSE);一个窗口点右上角×,只有该窗口会关闭
2.而setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);一个窗口点右上角×,软件的所有窗口都会关闭

2 .JDialog窗体

JDialog窗体是Swing组件中的对话框,继承了AWT组件中的java.awt.Dialog类。功能是从一个窗体中弹
出另一个窗体。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//主窗口
public class TestJDialog extends JFrame {public TestJDialog(){setVisible(true);setSize(700,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);Container container = this.getContentPane();//绝对布局getContentPane().setLayout(null);//按钮JButton button = new JButton("点击弹出一个对话框");button.setBounds(30,30,200,50);//监听按钮事件,点击按钮弹出弹窗button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//弹窗new MyDialog();}});container.add(button);}public static void main(String[] args) {new TestJDialog();}
}
//弹窗的窗口
class MyDialog extends JDialog{public MyDialog(){this.setVisible(true);this.setBounds(100,100,500,500);Container container = this.getContentPane();container.setLayout(null);container.add(new Label("Java"));}
}

二、标签组件

在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。上面我们提到的JLabel就是这里的内容。

1. 标签

标签由JLabel类定义,可以显示一行只读文本、一个图像或带图像的文本。

JLabel lable = new JLabel();

2. 图标

Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。

图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建。

在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。

import javax.swing.*;
import java.awt.*;//图标,接口,需要实现类
public class TestIcon extends JFrame implements Icon {private int width;private int height;public TestIcon(){}public TestIcon(int width, int height) {this.width = width;this.height = height;}public void init(){TestIcon testIcon = new TestIcon(15, 15);//图标放在标签,按钮上JLabel label = new JLabel("icon", testIcon, SwingConstants.CENTER);Container container = getContentPane();container.add(label);setVisible(true);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {g.fillOval(x,y,width,height);}@Overridepublic int getIconWidth() {return this.width;}@Overridepublic int getIconHeight() {return this.height;}public static void main(String[] args) {new TestIcon().init();}
}

Swing中的图标除了可以绘制之外,还可以使用某个特定的图片创建。
利用javax.swing.ImageIcon类根据现有图片创建图标。

下面看一个实例,我们先在包下放一个图片(注意放置位置,不同位置路径不同),如下:
在这里插入图片描述

package com.demo4;import javax.swing.*;
import java.awt.*;
import java.net.URL;public class TestImageIcon extends JFrame {public TestImageIcon(){//获取图片的地址  从当前类的路径下获取URL url = this.getClass().getResource("Java.jpg");ImageIcon imageIcon = new ImageIcon(url);//JLabel label = new JLabel("ImageIcon");//label.setIcon(imageIcon);//label.setHorizontalAlignment(SwingConstants.CENTER);JLabel label = new JLabel("ImageIcon", imageIcon, SwingConstants.CENTER);Container container = this.getContentPane();container.add(label);setVisible(true);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setBounds(100,100,200,200);}public static void main(String[] args) {new TestImageIcon();}}

对于图片标签,我们经常将图片放置在标签上,用JLabel中的setIcon()方法即可,当然也可以在初始化JLabel对象时为标签指定图标,这需要获取一个Icon实例。
getResource()方法可以获得资源文件的URL路径,这里的路径是相对于前面的那个类的,所以可将该图片与该类放在同一个文件夹下;如果不在同一个文件夹下,需通过其它方法获取路径。

三、面板

面板也是一个容器,可作为容器容纳其他组件,但也必须被添加到其他容器中。

Swing中常用面板有JPanel面板和JScrollPane面板。

1. JPanel

import javax.swing.*;
import java.awt.*;public class JPanelDemo extends JFrame {public JPanelDemo(){Container container = this.getContentPane();container.setLayout(new GridLayout(2, 1, 10, 10)); // 整个容器为2行1列JPanel p1 = new JPanel(new GridLayout(1, 3)); // 初始化一个面板,设置1行3列的网格布局JPanel p2 = new JPanel(new GridLayout(1, 2)); // 初始化一个面板,设置1行2列的网格布局JPanel p3 = new JPanel(new GridLayout(2, 1)); // 初始化一个面板,设置2行1列的网格布局JPanel p4 = new JPanel(new GridLayout(3, 2)); // 初始化一个面板,设置3行2列的网格布局p1.add(new JButton("1"));p1.add(new JButton("1"));p1.add(new JButton("1"));p2.add(new JButton("2"));p2.add(new JButton("2"));p3.add(new JButton("3"));p3.add(new JButton("3"));p4.add(new JButton("4"));p4.add(new JButton("4"));p4.add(new JButton("4"));p4.add(new JButton("4"));p4.add(new JButton("4"));p4.add(new JButton("4"));container.add(p1);container.add(p2);container.add(p3);container.add(p4);setVisible(true);setSize(500,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JPanelDemo();}
}

2. JScrollPane

若遇到一个较小的容器窗体中显示一个较大部分内容的情况,可用JScrollPane面板。这是一个带滚动条的面板,就像平时浏览网页,经常遇到的滚动条一样。

如果需要在JScrollPane面板中放置多个组件,需将这多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane面板上。

import javax.swing.*;
import java.awt.*;public class JScrollPaneDemo extends JFrame {public JScrollPaneDemo(){Container container = getContentPane();//文本域JTextArea textArea = new JTextArea(20,50);textArea.setText("Java");//Scroll面板JScrollPane jScrollPane = new JScrollPane(textArea);container.add(jScrollPane);setVisible(true);setSize(500,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JScrollPaneDemo();}
}

四、按钮组件

1. 图片按钮

JButton在之前的例子中已经出现多次,是较为常用的组件,用于触发特定动作。可以在按钮上显示文本标签,还可以显示图标。

import javax.swing.*;
import java.awt.*;
import java.net.URL;public class JButtonDemo1 extends JFrame {public JButtonDemo(){Container container = getContentPane();URL resource = this.getClass().getResource("Java.jpg");ImageIcon imageIcon = new ImageIcon(resource);//将图标放在按钮上JButton button = new JButton();button.setIcon(imageIcon);button.setToolTipText("图片按钮");container.add(button);setVisible(true);setSize(500,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo();}
}

2. 单选按钮

默认情况下,单选按钮显示一个圆形图标,通常在其旁放置一些说明性文字。当用户选中某个单选按钮后,按钮组中其它按钮将被自动取消,这时就需要按钮组(ButtonGroup)来将同组按钮放在一起,该按钮组中的按钮只能选择一个,而不在此按钮中的按钮不受影响。

import javax.swing.*;
import java.awt.*;public class JButtonDemo2 extends JFrame{public JButtonDemo2(){Container container = getContentPane();//单选框JRadioButton radioButton1 = new JRadioButton("1");JRadioButton radioButton2 = new JRadioButton("2");JRadioButton radioButton3 = new JRadioButton("3");//由于单选框只能选一个,进行分组//如果没有进行分组,可以同时选择多个ButtonGroup buttonGroup = new ButtonGroup();buttonGroup.add(radioButton1);buttonGroup.add(radioButton2);buttonGroup.add(radioButton3);container.add(radioButton1,BorderLayout.NORTH);container.add(radioButton2,BorderLayout.CENTER);container.add(radioButton3,BorderLayout.SOUTH);setVisible(true);setSize(500,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo2();}
}

3. 复选框

复选框是一个方块图标,外加一段描述性文字,与单选按钮的区别就是可以多选。每一个复选框都提供“选中”与“不选中”两种状态。

import javax.swing.*;
import java.awt.*;public class JButtonDemo3 extends JFrame {public JButtonDemo3(){Container container = getContentPane();JCheckBox checkBox1 = new JCheckBox("Java");JCheckBox CheckBox2 = new JCheckBox("C++");container.add(checkBox1,BorderLayout.NORTH);container.add(CheckBox2,BorderLayout.SOUTH);this.setVisible(true);this.setSize(500, 350);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo3();}
}

五、列表组件

1. 下拉列表(JComboBox)

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TestComboBox extends JFrame {public TestComboBox(){Container container = getContentPane();JComboBox comboBox = new JComboBox();comboBox.addItem(null);comboBox.addItem("正在上映");comboBox.addItem("即将上映");comboBox.addItem("下架");comboBox.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println(comboBox.getSelectedIndex()); //返回下标System.out.println(comboBox.getSelectedItem());  //返回内容}});container.add(comboBox);this.setVisible(true);this.setSize(500, 350);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new TestComboBox();}
}

2. 列表框(JList)

package com;import javax.swing.*;
import java.awt.*;public class TestJList extends JFrame{public TestJList(){Container container = getContentPane();//生成列表的内容String[] str={"1","2","3"};JList jList = new JList(str);container.add(jList);this.setVisible(true);this.setSize(500, 350);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new TestJList();}}

六、文本组件

1. 文本框(JTextField)

文本框用来显示或编辑一个单行文本

import javax.swing.*;
import java.awt.*;public class TestJTestField extends JFrame {public TestJTestField(){Container container = getContentPane();//这里由于布局问题,文本框的长度改变container.setLayout(new GridLayout(2,1));JTextField jTextField1 = new JTextField("Java");// 创建一个文本框,值为JavaJTextField jTextField2 = new JTextField("C++",20);// 创建一个长度为20的文本框,值为C++container.add(jTextField1);container.add(jTextField2);this.setVisible(true);this.setSize(500, 350);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new TestJTestField();}
}

2. 密码框(JPasswordField)

密码框与文本框的定义与用法类似,但会使用户输入的字符串以某种符号进行加密。

import javax.swing.*;
import java.awt.*;public class TestJPasswordField extends JFrame {public TestJPasswordField(){Container container = getContentPane();JPasswordField jPasswordField = new JPasswordField();jPasswordField.setEchoChar('$');  //char 类型 设置回显符号container.add(jPasswordField);this.setVisible(true);this.setSize(500, 350);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new TestJPasswordField();}
}

3. 文本域(JTextArea)

文本域组件在上面JScrollPane面板的代码中已经出现

配合面板使用

package com.demo5;import javax.swing.*;
import java.awt.*;public class JScrollPaneDemo extends JFrame {public JScrollPaneDemo(){Container container = getContentPane();//文本域JTextArea textArea = new JTextArea(20,50);textArea.setText("Java");//Scroll面板JScrollPane jScrollPane = new JScrollPane(textArea);container.add(jScrollPane);setVisible(true);setSize(500,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JScrollPaneDemo();}
}

相关文章:

GUI编程(二)

Swing Swing是GUI(图形用户界面)开发工具包。 早期的AWT(抽象窗口工具包)组件开发的图形用户界面,要依赖本地系统,当把AWT组件开发的应用程序移植到其他平台的系统上运行时,不能保证其外观风格…...

俩小伙一晚上写了个 AI 应用,月入两万??(文末附开发教程)

开发出一款能够与 AI 对话生成和编辑思维导图的工具,听起来似乎只能是一群专业的 AI 背景团队花费大量的时间和精力训练模型,打磨应用才能完成的事情。 但是,两名大学生却在一夜之间完成了,就像炼金术士将庸俗的材料转化成黄金一…...

Python爬虫常用框架

大家都知道python是一门多岗位编程语言,学习python之后可以从事的岗位有很多,python爬虫便在其中,不过很多人对python不是很了解,所以也不知道python爬虫是什么,接下来小编为大家介绍一下。 Python是一门非常适合开发…...

2023亚马逊云科技研究,数字化技能为中国企业和员工带来经济效益

在中国,信息技术在个人、企业和宏观经济层面都推动着重大变革。为了研究这些变化所带来的影响,盖洛普咨询公司(Gallup)和亚马逊云科技开展了关于数字化技能的调研。 研究表明,数字化技能正在为中国企业和在职人员带来巨大的经济价值&#x…...

springboot使用mybatis

扫描mapper接口的位置,生成代理对象 在application.properties配置数据源 测试: 在application.properties配置mybaits,支持驼峰命名,下划线 结果映射: Insert语句例子 在application.properties配置日志 更新 总结: 结果复用 ResultMap第二种…...

为什么是三次握手和四次挥手

文章目录 为什么是三次握手为什么是四次挥手什么是TIME_WAIT状态解决TIME_WAIT状态引起的bind失败的方法 为什么是三次握手 因为这是双方都有收发的最小次数 握手的目的:确认网络好着没,对方好着没 确认双方主机是否健康(双方)…...

Codeforces Round 867 (Div 3) 总结

文章目录 ABCDE 文章首发于我的个人博客:欢迎大佬们来逛逛 Dashboard - Codeforces Round 867 (Div. 3) - Codeforces A 题目大意:有n个电视节目,每个电视节目占据一定的时间,并且具有一个娱乐值,一秒可以额换一次台…...

vue修饰符的使用

事件修饰符: 在处理事件时调用 event.preventDefault() 或 event.stopPropagation() 是很常见的。尽管我们可以直接在方法内调用,但如果方法能更专注于数据逻辑而不用去处理 DOM 事件的细节会更好。 为解决这一问题,Vue 为 v-on 提供了事件…...

2023年五一数学建模 B 题过程与结果

文章目录 第一问第二问数据时序分析Auto-ARIMA第二问求解解的情况A->Q:D-> AQ-V总快递数 第三问第四问遗传算法求解 第五问SARIMA 模型拟合季节性规律 第一问 见 2023 年 五一杯 B 题过程 代码(第一问) 第二问 第二问考虑是一个时序预测问题&a…...

搞懂 API ,API 中 URI 设计规范分享

API(Application Programming Interface)是现代软件开发中的一项关键技术,它为不同应用程序间提供了数据和功能交互的标准化方式。而 URI(Uniform Resource Identifier)作为 API 中的重要部分,其规范和良好…...

【DarkLabel】使用教程(标注MOT数据集)

DarkLabel 使用教程 功能部分 Open video 第 2 处的内容为数据集类型。例如:VOC、COCO、MOT、YOLO等。 第 3 处的内容为标签名称。 可在 darklabel.yml 中修改 classes_set。例如:classes_set: "mot_classes" 第 4 处的内容为两种跟踪方法…...

Python3 迭代器与生成器

Python3 中的迭代器和生成器是 Python 编程中非常重要的概念,它们可以帮助我们更高效地处理数据和管理内存。下面分别介绍一下迭代器和生成器的概念和用法。 ## 迭代器 迭代器是一个可以遍历一个容器(如列表或元组)中的所有元素的对象&…...

C++基础 类的自动转换和强制类型转换

参考 C Primer Plus (第6版) 类自动转换 接受一个参数的构造函数允许使用赋值语法将对象初始化一个值 Classname object value; 等价于 ClassName object(value); 等价于 ClassName object ClassName(value); 只有接受一个参数的构造函数才能作为转换构造函数(某类型->…...

MySQL索引的底层实现原理

索引的底层实现原理 数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引树的节点),索引树越低,越“矮胖”,磁盘IO次数…...

Linux 更新

Linux权限系统 01 只读 1 10 只写 2 100 只执行 4 11 可读写 3 101 可读执行 5 110 可写执行 6 111 可读写执行 7...

华为OD机试 - 端口合并(Python)

题目描述 有M个端口组(1<=M<=10), 每个端口组是长度为N的整数数组(1<=N<=100), 如果端口组间存在2个及以上不同端口相同,则认为这2个端口组互相关联,可以合并。 输入描述 第一行输入端口组个数M,再输入M行,每行逗号分割,代表端口组。 备注:端口组内数字…...

分部积分法习题

前置知识&#xff1a;分部积分法 例题 计算积分 I n ∫ [ ( x a ) 2 b 2 ] − k d x ( n ≥ 1 ) I_n\int [(xa)^2b^2]^{-k}dx \quad(n\geq 1) In​∫[(xa)2b2]−kdx(n≥1) 解&#xff1a; \qquad 用分部积分法&#xff0c;对任何自然数 k ≥ 1 k\geq 1 k≥1&#xff0c;…...

C++—非递归【循环】遍历二叉树(前序,中序,后序)思路讲解+代码实现

非递归遍历二叉树 前序中序后序 接下来我们在研究如何使用循环实现遍历二叉树时&#xff0c;以下面的二叉树为例&#xff1a; 在下文的讲解中&#xff0c;不对如何构建这颗二叉树做讲解&#xff0c;直接给出代码&#xff0c;如果有不懂的地方欢迎私信我。 文章中的完整源代码链…...

前端002_初始化项目

1、命名和启动项目 将目录名 vue-admin-template-master 重命名为 db-manager-system 将 db-manager-system/package.json 中的 name 值改为 db-manager-system {"name": "db-manager-system","version": "1.0.1","descriptio…...

组合设计模式

组合模式 组合模式定义使用场景1、文件系统的目录结构&#xff1a;2、组织架构图&#xff1a;3、菜单和菜单项&#xff1a;4、使用场景总结&#xff1a; 角色定义Component 抽象构件角色:Leaf 叶子构件:Composite 树枝构件: 需求背景代码实现Component&#xff08;抽象构件角色…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...