当前位置: 首页 > 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;抽象构件角色…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...