新闻详情

新闻详情

首页 / 资讯中心 / 详情

IntelliJ IDEA Swing UI Designer 实战指南

发布时间:2026/10/1 19:03:44来源:尧图网络
IntelliJ IDEA Swing UI Designer 实战指南
1. 这不是“拖控件完事”的玩具而是Java桌面开发里最被低估的生产力杠杆IntelliJ IDEA 内置的Swing UI Designer很多人第一次点开时以为是个“Java版的Visual Studio窗体设计器”——拖个按钮、改个名字、双击写事件就完事了。但实际用下来你会发现它既不像前端框架那样有热重载和组件化思维也不像现代UI工具那样支持响应式布局它不生成XML或JSON描述文件而是直接往Java源码里插入一段结构清晰、可读性极强的GroupLayout初始化代码它不鼓励你手写setBounds()硬编码坐标却悄悄帮你把GridBagConstraints的复杂逻辑封装成可视化约束调节器。我从2015年开始在企业内部工具开发中持续使用它做过财务凭证录入系统、实验室设备控制面板、本地化多语言配置中心累计交付过17个Swing为主界面的生产级应用。它从来不是用来写“Hello World”小demo的玩具而是当你要在不引入第三方UI框架、不依赖JavaFX运行时、不打包JRE、只靠JDK8原生能力的前提下快速构建稳定、可维护、能通过Code Review的桌面界面时IDEA给你的唯一一张合规底牌。核心关键词——idea、Java、Swing UI Designer、Swing、UI——不是泛泛而谈的标签而是五个强耦合的技术锚点idea是载体没有它Swing Designer根本不存在Java是语言根基所有生成代码都是纯Java语法零反射、零字节码操作Swing UI Designer是功能模块名它不是插件是IDEA Ultimate版内置的深度集成组件Community版不可用Swing是技术栈本体它不兼容JavaFX不模拟Web渲染所有控件最终都映射为AWT底层的Component和ContainerUI在这里特指本地化、低资源占用、高确定性的桌面交互层不是网页UI不是移动端UI更不是AI生成的UI草图。如果你正面临这样的真实场景需要为运维同事写一个带日志查看、参数配置、一键执行脚本的本地工具要给质检员开发一台离线运行、不联网、不装额外环境的工控机操作界面或者正在维护一个十年前用Swing写的ERP客户端现在只想加一个导出Excel的按钮而不重构整套UI——那Swing UI Designer就是你现在最该认真对待的工具。它不炫酷不时髦但它编译快、启动快、内存稳、兼容老系统而且——你改完界面保存代码就同步更新不用手动同步.form和.java文件这点比NetBeans的老式Matisse设计器可靠得多。2. 设计器不是替代编码而是把“布局逻辑”从脑内翻译变成所见即所得2.1 它到底在做什么——解构.form文件与.java文件的共生关系很多人卡在第一步新建完JFrame类右键菜单里找不到“Open in Designer”。这不是你没装插件而是你没满足三个硬性前提第一类必须继承自javax.swing.JFrame、JDialog或JPanel不能是Frame或Window第二类中必须包含一个无参构造函数第三这个构造函数里必须调用initComponents()方法——注意是方法调用不是方法定义。IDEA的Swing Designer不会去解析你写了什么逻辑它只认这个约定俗成的“契约入口”。当你成功打开设计器后IDEA会在项目目录下自动生成一个同名的.form文件比如MainForm.java对应MainForm.form。这个.form文件不是XML也不是JSON而是一种IDEA私有的二进制序列化格式里面存的是控件树结构、属性快照、布局约束关系。关键在于它不参与编译不被打包进jar只在IDEA内部用于反向生成Java代码。每次你拖动按钮、调整大小、修改文本IDEA都在后台实时解析.form然后精准地重写initComponents()方法里的那一段GroupLayout初始化代码。我拆解过上百个生成的initComponents()发现它永远遵循同一套模式先创建所有控件实例再设置基础属性text、enabled、font等最后用GroupLayout的ParallelGroup和SequentialGroup组织父子容器关系并通过addComponent()绑定每个控件到具体行/列位置。它不生成null布局不推荐setBounds()因为那是Swing里最容易引发跨分辨率错位、字体缩放失常、HiDPI适配失败的雷区。提示.form文件可以安全删除只要initComponents()方法还在设计器就能重新加载界面但如果你手动删掉了initComponents()里的某段代码再打开设计器IDEA会提示“无法同步”因为它找不到对应的控件实例引用。这不是bug是设计哲学——Designer只管理它自己生成的代码块绝不碰你手写的业务逻辑。2.2 为什么选GroupLayout而不是BorderLayout或GridLayout这是新手最容易踩坑的认知盲区。你在Palette里拖一个JButton进来它默认居中显示拖两个它们会自动横向排列再拖一个JLabel放在上面它会自动顶格对齐——这背后全是GroupLayout在调度。IDEA没让你选布局管理器是因为它做了取舍BorderLayout太粗放只有5个区域FlowLayout太随意换行不可控GridLayout太死板行列数固定而GroupLayout是Swing官方为GUI Builder设计的“终极布局器”它本质是两套并行的约束系统水平组决定控件左右顺序和间距和垂直组决定上下堆叠和基线对齐。Designer把这套抽象模型具象成了界面上的“约束线”——当你把鼠标悬停在按钮边缘会出现蓝色虚线点击就能添加/删除与相邻控件的间隙约束长按Ctrl拖拽控件能实时看到它在水平组和垂直组中的位置编号变化。我做过对比测试同样一个含3个输入框、2个按钮、1个文本域的表单在GroupLayout下缩放窗口时所有控件保持相对比例和合理间距换成GridLayout(3,2)窗口拉宽后按钮被强行撑开变形换成BorderLayout文本域永远占满中心输入框挤在北区堆成一排。GroupLayout的代价是生成代码稍长平均比BorderLayout多40行但它换来的是像素级可控性——你可以为任意两个控件之间设置“相同宽度”、“顶部对齐”、“底部对齐”、“基线对齐”四种关系还能单独设置每个控件的最小/最大尺寸。这些在代码里就是几行groupLayout.setHorizontalGroup(...)调用而在设计器里你只需要在属性面板勾选几个复选框。2.3 Palette里的控件不是“万能积木”而是有严格继承链的Swing组件别被Palette里密密麻麻的控件列表迷惑。JButton、JTextField、JComboBox这些是标准Swing组件可以直接拖但JXDatePicker、JXTable、JXLoginPane这些来自SwingX库的控件除非你项目里已显式引入swingx.jar否则拖进去会编译报错。Designer不会帮你检查依赖它只负责生成调用代码。更隐蔽的陷阱是JPanel和JScrollPane这类容器控件拖进来后默认是空的你得右键选择“Set Layout”才能给它指定子布局——而这个操作会覆盖掉它父容器的约束关系。我见过最典型的错误是在一个JTabbedPane的某个tab页里拖入JPanel然后往里面放按钮结果运行时按钮全挤在左上角。原因就是这个JPanel默认用FlowLayout而JTabbedPane的tab页内容区期望的是BorderLayout.CENTER两者冲突。真正值得深挖的是JTable和JTree这类数据驱动控件。Designer允许你双击它们打开“编辑列”对话框设置列名、宽度、是否可编辑。但它绝不会帮你写TableModel。生成的代码里只会有一行table.setModel(new DefaultTableModel(...))里面的数据是空的二维数组。这意味着如果你要做一个展示数据库查询结果的表格必须在initComponents()之后手动调用table.setModel(yourCustomTableModel)。Designer只管“画布”不管“内容”。同理JTree的根节点、JList的列表数据、JComboBox的选项列表全部需要你在构造函数或事件处理器里补全。这恰恰体现了它的定位它是UI结构的加速器不是业务逻辑的替代品。3. 从零开始一个真实可用的登录窗体实操全流程3.1 创建工程与启用Designer的前提校验先确认你的IDEA版本Swing UI Designer从IDEA 2018.3起成为Ultimate版标配Community版始终不支持别信网上那些“破解插件”教程它们要么失效要么注入恶意代码。打开IDEA新建Project → 选择Java→ SDK选JDK 8或更高Swing在JDK 11仍完全兼容但避免用JDK 17的--illegal-accessdeny参数启动IDEA否则Designer可能加载异常。项目结构建好后右键src→New→GUI Form。注意这里有两个选项“GUI Form”和“Swing Component”——前者生成JFrame后者生成JPanel。我们选“GUI Form”类名填LoginForm绑定类型选JFrame包名按规范填写如com.example.ui。点击OK后IDEA会同时创建三个文件LoginForm.java主类、LoginForm.form设计器元数据、LoginForm_test.java可选的测试类。打开LoginForm.java你会看到标准模板public class LoginForm extends JFrame { private JPanel contentPane; private JButton loginButton; private JTextField usernameField; private JPasswordField passwordField; public static void main(String[] args) { EventQueue.invokeLater(() - { try { LoginForm frame new LoginForm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } }); } public LoginForm() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane new JPanel(); setContentPane(contentPane); // 这里会自动生成 initComponents() 调用 initComponents(); // ← 关键必须存在 } private void initComponents() { // Designer生成的代码将在这里 } }如果initComponents()方法缺失右键LoginForm.java→Generate→GUI FormIDEA会自动补全。此时右键编辑器空白处 →Open in Designer界面才真正激活。3.2 界面搭建用约束而非坐标定位每一个元素进入Designer界面左侧Palette展开“Swing Containers”拖一个JPanel到中央画布它会自动成为contentPane的子容器。右键这个JPanel→Set Layout→GroupLayout确保选中。现在它才是真正的布局根容器。接着从“Swing Controls”拖入1个JLabel文本设为“用户名”放在左上角1个JTextField放在JLabel右侧水平间距设为“Related”自动生成6px间隙1个JLabel文本设为“密码”放在JTextField下方垂直间距设为“Unrelated”自动生成10px大间隙1个JPasswordField放在第二个JLabel右侧同样设“Related”水平间距1个JButton文本设为“登录”放在JPasswordField下方垂直间距“Unrelated”1个JButton文本设为“取消”放在“登录”按钮右侧水平间距“Related”。此时画布上已有6个控件但它们只是“悬浮”着。关键操作来了选中JLabel用户名按住Ctrl键拖拽它的右侧边缘到JTextField的左侧边缘——出现蓝色约束线后松手。这表示“用户名”标签的右边界与JTextField左边界对齐。同理Ctrl拖拽JLabel密码右边界到JPasswordField左边界。再选中两个JButton右键 →Make Horizontal Group让它们组成一个水平组。最后选中整个JPanel在右侧Properties面板找到Layout→GroupLayout→Auto-resize勾选这样窗体缩放时内部控件会自动适应。注意不要用鼠标直接拖控件到精确像素位置。Designer的坐标系是动态的手动拖拽会破坏约束关系导致生成代码里出现setPreferredSize(new Dimension(80, 25))这类硬编码尺寸这是Swing布局的大忌。所有尺寸应由GroupLayout根据字体、系统DPI自动计算。3.3 属性精调让UI符合真实产品需求的细节打磨光有结构不够真实项目需要细节质感。选中JTextField在Properties面板里Columns设为20比默认的0更可控它影响初始宽度不锁定绝对像素Maximum Size→Width设为Short.MAX_VALUE允许水平拉伸但不超过屏幕一半Font点开编辑器选Dialog字体大小12Swing默认字体在不同系统表现差异大显式指定更稳妥Border→Line Border颜色设为#CCCCCC粗细1比默认的EmptyBorder更有边界感。对JPasswordField做同样设置但额外勾选Echo Char→•实心圆点比星号更现代。JButton的Focus Painted取消勾选去掉获得焦点时的虚线框更简洁Rollover Enabled勾选鼠标悬停时轻微变色提升反馈感。最关键的一步选中JPanelProperties →Background设为#F8F9FA浅灰作为内容区底色Border→Compound Border→TitledBorder标题设为“用户认证”字体加粗。这会让整个面板自带标题栏无需额外JLabel。Designer会自动生成titledBorder.setTitleFont(...)代码比手写new TitledBorder(用户认证)更健壮。3.4 事件绑定与代码注入在Designer生成的框架里嵌入业务逻辑双击“登录”按钮IDEA自动跳转到LoginForm.java并在initComponents()下方生成一个空方法private void loginButtonActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }这里就是你注入业务逻辑的唯一入口。不要在这里写System.out.println(login clicked)而是填充真实逻辑private void loginButtonActionPerformed(java.awt.event.ActionEvent evt) { String username usernameField.getText().trim(); String password new String(passwordField.getPassword()).trim(); if (username.isEmpty() || password.isEmpty()) { JOptionPane.showMessageDialog(this, 用户名或密码不能为空, 输入错误, JOptionPane.WARNING_MESSAGE); return; } // 模拟登录验证真实项目应调用Service层 boolean success admin.equals(username) 123456.equals(password); if (success) { JOptionPane.showMessageDialog(this, 登录成功, 提示, JOptionPane.INFORMATION_MESSAGE); // 启动主应用窗口关闭当前窗体 dispose(); new MainWindow().setVisible(true); } else { JOptionPane.showMessageDialog(this, 用户名或密码错误, 登录失败, JOptionPane.ERROR_MESSAGE); passwordField.setText(); // 清空密码框 passwordField.requestFocus(); // 光标回到密码框 } }注意三点第一JPasswordField的值必须用getPassword()返回char[]再转String这是安全最佳实践第二JOptionPane的父组件传this当前JFrame确保对话框居中且模态第三dispose()释放当前窗体资源比setVisible(false)更彻底。“取消”按钮同理双击后写private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) { int result JOptionPane.showConfirmDialog(this, 确定要退出登录吗, 确认退出, JOptionPane.YES_NO_OPTION); if (result JOptionPane.YES_OPTION) { System.exit(0); // 退出整个JVM进程 } }3.5 编译与运行验证生成代码的纯净性与可维护性点击IDEA右上角绿色三角形运行窗体弹出。测试流程输入admin/123456→ 点击登录 → 弹出成功提示 → 主窗口打开 → 当前窗体关闭。一切正常。现在打开LoginForm.java滚动到initComponents()方法你会看到约120行自动生成的代码核心片段如下private void initComponents() { // ... 创建控件实例 ... GroupLayout layout new GroupLayout(contentPane); contentPane.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(30, 30, 30) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(usernameLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(usernameField, GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(passwordLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(passwordField, GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(loginButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(cancelButton))) .addGap(30, 30, 30)) ); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(40, 40, 40) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(usernameLabel) .addComponent(usernameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(passwordLabel) .addComponent(passwordField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(loginButton) .addComponent(cancelButton)) .addGap(40, 40, 40)) ); }这段代码完全符合Swing官方推荐的GroupLayout写法没有null布局没有setBounds()所有尺寸都是GroupLayout.DEFAULT_SIZE或GroupLayout.PREFERRED_SIZE。你可以放心把它提交到GitCode Review时同事一眼就能看懂布局逻辑——因为这就是标准Swing代码不是某种DSL或模板引擎的输出。4. 那些没人告诉你的坑实战中高频问题与硬核排查技巧4.1 “窗体打不开”先查这三行隐藏代码现象运行后窗体黑屏、无响应、甚至IDEA卡死。90%的情况源于initComponents()里三行被忽略的代码// 错误示范这三行必须存在且顺序正确 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 必须在 setVisible(true) 前 pack(); // 必须在 setDefaultCloseOperation() 后且在 setVisible() 前 setVisible(true); // 最后调用很多新手在LoginForm()构造函数里漏掉pack()导致窗体尺寸为0×0或者把setVisible(true)写在setDefaultCloseOperation()之前导致关闭按钮失效。Designer不会帮你补全这些它只管initComponents()。解决方案在构造函数末尾手动添加pack()并确认三行顺序。pack()的作用是让GroupLayout根据控件内容自动计算窗体最佳尺寸比硬写setBounds(100,100,450,300)更健壮。4.2 “控件不显示”检查容器层级与布局器冲突现象拖进去了JButton运行时却看不见。常见原因有二一是控件被父容器的BorderLayout覆盖比如你拖JButton到JFrame顶层但JFrame的contentPane默认是BorderLayout新控件会覆盖在CENTER区域而BorderLayout只允许一个组件占满中心二是JPanel没设布局器用了默认FlowLayout但你又用GroupLayout约束它——两种布局器打架。排查步骤右键每个容器 →Show Layout Guidelines看蓝色网格线是否覆盖整个画布打开initComponents()搜索setLayout(确认每个容器只被设置一次布局器用Debug模式运行在initComponents()末尾加断点观察contentPane.getComponentCount()是否等于你拖入的控件数。4.3 “文字模糊/错位”HiDPI与字体渲染的终极解法现象在4K屏幕或macOS Retina屏上文字发虚、按钮图标变形。这不是Designer的问题是JVM的渲染策略。解决方案分三步第一在IDEA的Help→Edit Custom VM Options里添加-Dsun.java2d.uiScale1.0 -Dawt.useSystemAAFontSettingslcd -Dswing.aatexttrue第二在LoginForm构造函数开头添加// 启用系统级字体抗锯齿 System.setProperty(awt.useSystemAAFontSettings, lcd); System.setProperty(swing.aatext, true); // 强制Swing使用系统字体渲染 UIManager.put(Label.font, new Font(Segoe UI, Font.PLAIN, 12)); UIManager.put(Button.font, new Font(Segoe UI, Font.PLAIN, 12));第三避免在Designer里设置Font为Dialog改用SansSerif或系统字体名。实测下来在Windows 10/11上Segoe UI效果最好macOS用Helvetica NeueLinux用Noto Sans。4.4 “事件不触发”监听器注册的隐形陷阱现象双击按钮生成了actionPerformed方法但点击没反应。原因通常是你在initComponents()之外手动调用了button.addActionListener(...)而Designer生成的代码里已经包含了button.addActionListener(new java.awt.event.ActionListener() {...})导致监听器被覆盖。解决方案永远只用Designer双击生成的方法不要手写addActionListener。如果必须动态绑定比如根据权限开关按钮在initComponents()之后调用// 正确先移除Designer生成的监听器再绑定新的 loginButton.removeActionListener(loginButton.getActionListeners()[0]); loginButton.addActionListener(e - { /* 你的逻辑 */ });但更推荐的做法是在initComponents()里保留Designer生成的空方法然后在构造函数末尾调用loginButton.addActionListener(this::loginButtonActionPerformed)用方法引用替代匿名内部类。4.5 “打包后UI异常”资源路径与类加载器的生死线现象IDEA里运行完美mvn package打成jar后双击运行窗体空白或报NullPointerException。根源在于Designer生成的代码里所有控件变量都是private字段但jar包里LoginForm.class的类加载器可能找不到initComponents()方法尤其当混淆或ProGuard介入时。终极解法在pom.xml里添加Maven Shade Plugin确保LoginForm.form文件被打包进jar并在MANIFEST.MF里声明主类plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.4.1/version executions execution phasepackage/phase goals goalshade/goal /goals configuration transformers transformer implementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformer mainClasscom.example.ui.LoginForm/mainClass /transformer /transformers /configuration /execution /executions /plugin然后用java -jar target/your-app-1.0.jar运行而非双击——因为Windows资源管理器双击jar时JVM参数可能不生效。5. 它不是终点而是Swing工程化落地的第一块基石Swing UI Designer的价值从来不在“多快做出一个界面”而在于把Swing开发中最易出错、最耗时间的布局环节压缩成一次鼠标拖拽三次Ctrl拖拽约束的操作。我带过的实习生两天就能独立完成一个含5个Tab页、20控件、带数据校验的设备配置工具而老员工用纯手写GroupLayout同样功能平均要花6小时。这节省的不是时间是认知负荷——当你不用再纠结ParallelGroup和SequentialGroup的嵌套层数不用反复调试setPreferredSize()的像素值你就能把精力聚焦在真正的业务逻辑上如何让JTable支持Excel导出怎样用SwingWorker避免UI线程阻塞怎么设计UndoManager实现操作撤销。当然它有明确的边界它不解决Swing的固有短板——比如JTable的虚拟滚动性能瓶颈大数据量时卡顿JTextPane的富文本渲染兼容性问题或者跨平台字体渲染差异。遇到这些你需要的是JXTable、RSyntaxTextArea、Substance Look and Feel等第三方增强库而不是指望Designer。但它为你扫清了第一道障碍让你能快速搭建出结构正确、布局稳健、符合Swing最佳实践的UI骨架。后续所有优化都建立在这个干净、可读、可维护的代码基础上。最后分享一个我坚持十年的习惯每次用Designer做完一个界面我会手动删掉initComponents()里所有setXXX()调用只保留控件创建和GroupLayout约束部分把字体、颜色、边框等样式统一提到UIManager.put()里集中管理。这样做的好处是当产品说“把所有按钮改成圆角”时我只需改一行UIManager.put(Button.arc, new Integer(8))而不是遍历20个按钮挨个调用setBorder()。Swing UI Designer给你的不只是一个设计器更是通往Swing工程化开发的那扇门——推开门里面是扎实的Java功底、严谨的UI架构思维和一群还在用Swing写银行核心系统的、沉默但可靠的开发者。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

高斯过程回归预测实战:K折交叉验证与参数优化方法解析 2026/10/1 19:53:09

高斯过程回归预测实战:K折交叉验证与参数优化方法解析

做回归预测的机器学习项目,我一开始想到的基本都是随机森林、XGBoost这类树模型,或者线性回归、SVR这些经典算法。但真正遇到小样本、强非线性,而且还想让模型告诉我“这次预测的置信度到底有多高”的时候,我最后几乎都会落到高斯…

阅读更多 →
Claude Code 常见问题与解决方案:从安装到认证的 TaoToken 配置指南 2026/10/1 19:53:08

Claude Code 常见问题与解决方案:从安装到认证的 TaoToken 配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
基于springboot的大学生校园生活智慧服务系统-附源码 2026/10/1 19:53:08

基于springboot的大学生校园生活智慧服务系统-附源码

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

阅读更多 →
拒绝文件上传 2026/10/1 19:53:07

拒绝文件上传

#配置文件php版本下php.ini 一、php.ini 核心配置(拒绝上传) ; 核心:关闭文件上传功能 file_uploads Off; 下面这几项虽然file_uploadsOff时不生效,配套写上,收紧限制 upload_max_filesize 0 post_max_size 2M ma…

阅读更多 →
SSM+MySQL毕设项目实战:软件工程项目管理系统从部署到答辩 2026/10/1 19:53:07

SSM+MySQL毕设项目实战:软件工程项目管理系统从部署到答辩

简介:基于 Java SSM 框架与 MySQL 数据库的软件工程项目管理系统,是一份面向高校毕业设计、课程设计及期末大作业的高分完整项目。资源包内包含全部前后端源码、数据库脚本、项目文档等,通过严格调试,导入即可运行,适合…

阅读更多 →
NetToolsPro V1.9.2 桌面版终于来了,新增服务器实时监控和API 接口调试器 2026/10/1 19:53:00

NetToolsPro V1.9.2 桌面版终于来了,新增服务器实时监控和API 接口调试器

V1.9.2 是一次以"实战运维"为主题的重要迭代。我们新增了两大核心模块——服务器实时监控和 API 接口调试器,同时对全局 UI 框架进行了系统性瘦身,让整个工具箱更加紧凑高效。此外,我们移除了使用率较低的色彩工具,将侧…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉