简介:本资源为Java SE 7 Update 5(JDK 7u5)的64位Windows官方演示包,专为Java初学者、教学实践者及需兼容旧版JDK的开发者提供。它完整包含JDK核心组件(编译器javac、调试器jdb、JRE运行时等)及配套演示示例,适用于Windows x64平台下的Java基础开发、课堂实验与环境搭建。压缩包为ZIP格式,共含多个可执行文件、配置脚本与示例源码(如Swing GUI演示、NIO.2文件操作实例),整体大小15.69MB,轻量易部署。目前已有271人学习下载,反映出其在Java 7特性教学(如try-with-resources自动资源管理、Strings in switch、Fork/Join并行框架、NIO.2路径API等)中的实用价值。用户可直接解压即用,快速开展Java 7语法验证、API实践与经典Demo运行,是理解JDK 7演进脉络与夯实开发环境配置能力的重要实操素材。
1. 这不是 JDK 安装包,而是被遗忘的 Java 演示宝库:7u5 时代的 GUI、2D、声音与 SwingLab 实战资源
你手里的jdk-7u5-windows-x64-demos不是 JDK 本体,也不是运行环境,它是一份封存在 2013 年的「Java 教学黑匣子」——专为 Windows 64 位平台打包的官方演示套件。它不包含java.exe或javac.exe,但完整内置了 18 个可直接双击运行的.jar示例程序,覆盖 AWT/Swing 图形界面交互、Java 2D 矢量绘图、MIDI 音频合成、拖放(Drag & Drop)协议实操、SwingWorker 异步任务调度,甚至还有当时罕见的SwingLabs扩展组件(如JXTable、TaskPane)。这些不是玩具代码,而是 Oracle 官方用真实工程逻辑写的教学载体:Notepad演示文本编辑器的 Document/View 架构,SoundDemo展示javax.sound.midi的Synthesizer初始化链路,SwingSet2则把JTree节点懒加载、JTabbedPane动态页签、JXDatePicker日期选择器全揉进一个可调试的 GUI 工程里。如果你正带学生入门 Java GUI 开发,或需要快速验证某个 Swing 组件在真实 JVM 下的行为边界(比如JTable的prepareRenderer()在 JDK 7u5 中对null值的处理逻辑),这份资源比任何博客教程都更接近原始设计意图。它只适配 Windows x64 + JRE 7u5 及以上,不兼容 JDK 8+ 的模块化路径,也不支持 macOS/Linux —— 这不是缺陷,是它的时代指纹。
2. 解压即用:从文件结构到启动原理的逐层拆解
2.1 文件树即架构图:demos 目录下的真实组织逻辑
下载得到的压缩包解压后,目录结构异常清晰,没有冗余嵌套:
jdk-7u5-windows-x64-demos\ ├── demo\ │ ├── applets\ # Applet 演示(需浏览器插件,已淘汰但代码逻辑完整) │ ├── beans\ # JavaBeans 可视化属性编辑器(BeanBox) │ ├── jfc\ # 核心:Swing / 2D / DragDrop / Sound │ │ ├── Notepad\ # 完整记事本(含文件操作、字体选择、查找替换) │ │ ├── SwingSet2\ # Swing 组件大全(含 JXTable、JXDatePicker 等 SwingLabs 组件) │ │ ├── SoundDemo\ # MIDI 合成器控制台(旋钮映射到 Synthesizer Channel) │ │ └── ... # 其他如 DragDropDemo, Font2DTest 等 │ └── ... ├── README.html # 官方说明(含每个 demo 的启动命令和功能描述) └── demo.jar # 主入口 Jar(含启动器类 com.sun.demo.demos.DemoLauncher)提示:
demo.jar是整个套件的门面,但它本身不包含任何业务逻辑代码 —— 它只是一个 Launcher,通过反射加载demo/jfc/xxx/xxx.jar中的Main-Class。这种设计让每个 demo 可独立更新,也解释了为什么直接双击Notepad.jar会失败(缺少swingset2.jar的 classpath 依赖)。
2.2 启动三模式:为什么双击无效?必须用 java -jar 的底层原因
所有 demo 的启动本质都是java -cp <classpath> <main-class>,但官方提供了三种等效路径。切记:不能直接双击.jar文件,因为 Windows 默认关联的 JRE 可能未正确设置-Djava.ext.dirs,导致swinglabs扩展包无法加载。
方式一:通过demo.jar启动器(推荐新手)
# 进入解压根目录 cd jdk-7u5-windows-x64-demos # 启动图形化选择界面(自动扫描所有 demo) java -jar demo.jar该命令会拉起DemoLauncher窗口,列表显示全部 demo 名称(如Notepad,SwingSet2,SoundDemo),点击即可启动。其内部逻辑是读取demo/jfc/*/manifest.mf中的Main-Class和Class-Path,动态构建 classpath 并执行Runtime.getRuntime().exec()。
方式二:手动指定 classpath 启动(适合调试)
以Notepad为例,其MANIFEST.MF内容关键行如下:
Main-Class: sun.awt.windows.WNotepad Class-Path: ../lib/swing-layout-1.0.3.jar ../lib/swingx-1.6.2.jar对应启动命令为:
java -cp "demo\jfc\Notepad\Notepad.jar;demo\lib\swing-layout-1.0.3.jar;demo\lib\swingx-1.6.2.jar" sun.awt.windows.WNotepad参数说明:
-cp必须用分号;分隔(Windows),路径中的反斜杠\在命令行中无需转义;sun.awt.windows.WNotepad是 JDK 7u5 特有的 Windows 原生记事本实现类,非javax.swing.*,因此它能响应系统级快捷键(如 Ctrl+O)。
方式三:利用run.bat脚本(仅限部分 demo)
某些 demo(如SwingSet2)自带run.bat,内容为:
@echo off java -Xmx512m -cp "SwingSet2.jar;../lib/swingx-1.6.2.jar;../lib/swing-layout-1.0.3.jar" swingset2.SwingSet2 pause直接双击该 bat 文件即可,-Xmx512m是关键 ——SwingSet2加载大量图片资源,内存不足会直接OutOfMemoryError。
3. 源码即文档:从 jar 包反编译到可调试工程的完整迁移
3.1 反编译不是目的,定位关键类才是核心动作
demos目录下所有.jar文件均未混淆,且保留完整包名与类名。使用jd-gui或CFR反编译器打开Notepad.jar,你会看到:
sun.awt.windows.WNotepad.class:主窗口类,继承Frame(非JFrame),调用Win32GraphicsEnvironment创建原生窗口句柄;sun.awt.windows.WTextComponent.class:处理Ctrl+C/V的剪贴板逻辑,直接调用Toolkit.getDefaultToolkit().getSystemClipboard();sun.awt.windows.WMenuItem.class:菜单项点击事件绑定ActionListener,但actionPerformed()内部调用的是Win32Toolkit的本地方法。
关键洞察:这些
sun.*包下的类证明,Notepad并非纯 Swing 应用,而是混合了 AWT 原生层 —— 这正是它能在 JDK 7u5 上完美支持系统级 DPI 缩放的原因(而纯 Swing 应用在高分屏上会模糊)。
3.2 构建可调试的 IntelliJ IDEA 工程:四步落地法
将Notepad迁移为现代 IDE 可调试工程,需绕过sun.*包的访问限制(JDK 9+ 默认禁止),但 JDK 7u5 环境下可直接导入:
- 新建空项目:IDEA → New Project → Empty Project,JDK 选
1.7(必须是 7u5 或兼容版本); - 添加源码:右键
src→New → Module from Existing Sources→ 选择demo\jfc\Notepad\src(若无 src 目录,则从Notepad.jar中提取sun\awt\windows\*.java到src/sun/awt/windows/); - 配置依赖:
File → Project Structure → Libraries→ 添加demo\lib\swingx-1.6.2.jar和demo\lib\swing-layout-1.0.3.jar; - 设置启动参数:
Run → Edit Configurations → VM options填入-Dsun.java2d.noddraw=true(禁用 DirectDraw,避免 Win10 上黑屏)。
此时设置断点于WNotepad.actionPerformed(),点击菜单“文件→打开”,IDEA 将停在事件分发线程(EDT)中,你能清晰看到FileDialog如何通过Win32ShellFolderManager2获取系统 Shell 命名空间。
3.3 修改并重打包:给 Notepad 加一个“统计字数”菜单项(实战案例)
我们以增强Notepad功能为例,演示如何修改源码并生成新 jar:
- 在
WNotepad.java的createMenuBar()方法末尾插入:
// 新增统计菜单 MenuItem countItem = new MenuItem("统计字数"); countItem.addActionListener(e -> { String text = ta.getText(); // ta 是 TextArea 成员变量 int chars = text.length(); int lines = text.isEmpty() ? 0 : text.split("\n").length; JOptionPane.showMessageDialog(this, String.format("字符数:%d\n行数:%d", chars, lines), "字数统计", JOptionPane.INFORMATION_MESSAGE); }); fileMenu.add(countItem);- 重新编译
WNotepad.class,用jar命令更新Notepad.jar:
# 进入 Notepad 源码目录 cd demo\jfc\Notepad\src # 编译(需指定 JDK 7u5 的 tools.jar) javac -cp "..\..\..\lib\swingx-1.6.2.jar;..\..\..\lib\swing-layout-1.0.3.jar;C:\Program Files\Java\jdk1.7.0_05\lib\tools.jar" sun\awt\windows\WNotepad.java # 更新 jar(保留原 manifest) jar -uf ..\Notepad.jar sun\awt\windows\WNotepad.class- 启动验证:
java -jar Notepad.jar→ 菜单栏出现“统计字数”,点击弹出准确计数对话框。
血泪经验:
tools.jar必须显式加入 classpath,否则javac无法识别com.sun.tools.javac相关 API;jar -uf是唯一安全的更新方式,-c会覆盖原 manifest 导致启动失败。
4. 避坑指南:JDK 7u5 Demos 在现代 Windows 上的五大翻车现场
4.1 现象:双击demo.jar报错Could not find the main class
原因:Windows 默认用 JRE 8+ 打开.jar,而demo.jar的MANIFEST.MF中Main-Class: com.sun.demo.demos.DemoLauncher依赖sun.*包,JDK 8 默认启用--illegal-access=deny。
解决:强制指定 JDK 7u5 运行:
"C:\Program Files\Java\jdk1.7.0_05\bin\java.exe" -jar demo.jar4.2 现象:SoundDemo启动后旋钮无反应,控制台输出MidiSystem.getSynthesizer(): null
原因:Windows 10/11 默认禁用 Microsoft GS Wavetable Synth(旧版 MIDI 合成器),且 JDK 7u5 不支持通用 MIDI 接口(UMIDI)。
解决:
- 运行
control mmsys.cpl→ “播放”选项卡 → 右键“扬声器” → “属性” → “高级” → 勾选“允许应用程序独占控制该设备”; - 在
SoundDemo启动前,先执行:
java -Djavax.sound.midi.Synthesizer="com.sun.media.sound.MixerSynthesizer" -jar SoundDemo.jar4.3 现象:SwingSet2启动后界面文字模糊、按钮边缘锯齿
原因:JDK 7u5 的 Java 2D 渲染引擎未适配 Windows 高 DPI 缩放(125%/150%),默认使用位图缩放而非矢量重绘。
解决:启动时添加 JVM 参数强制启用 LCD 渲染:
java -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true -jar SwingSet2.jar4.4 现象:DragDropDemo中拖拽文件到窗口无响应,dropTargetDragEnter()从未触发
原因:Windows 10 UAC(用户账户控制)阻止低权限进程接收来自高权限进程(如文件资源管理器)的拖放数据。
解决:以管理员身份运行 CMD,再执行启动命令;或关闭 UAC(不推荐):
# 临时提权(需管理员权限) powershell -Command "Start-Process java -ArgumentList '-jar', 'DragDropDemo.jar' -Verb RunAs"4.5 现象:Font2DTest中中文显示为方块,日文显示正常
原因:Font2DTest使用GraphicsEnvironment.getAllFonts()加载字体,但 JDK 7u5 的字体发现机制在 Windows 10 上无法识别SimSun(宋体)的 Unicode 范围映射。
解决:手动指定中文字体路径:
java -Dfont2d.debug=true -Dawt.font.desktophints=true -jar Font2DTest.jar然后在测试界面顶部菜单选择File → Load Font...→ 浏览到C:\Windows\Fonts\simsun.ttc加载。
5. 进阶技巧:用 demos 反向验证 JVM 行为差异与 Swing 渲染链路
5.1 对比 JDK 7u5 与 JDK 8u202 的JTable单元格渲染差异
SwingSet2中的JTable示例是绝佳的对比样本。我们关注prepareRenderer()方法在不同 JDK 下对null值的处理:
| 场景 | JDK 7u5 行为 | JDK 8u202 行为 | 根本原因 |
|---|---|---|---|
table.setValueAt(null, 0, 1)后调用prepareRenderer() | 返回JLabel实例,getText()为"" | 抛NullPointerException | JDK 7u5 的DefaultTableCellRenderer对null值做空字符串转换;JDK 8 改为严格判空,要求开发者显式处理 |
设置table.setDefaultRenderer(Object.class, new NullSafeRenderer()) | 有效,NullSafeRenderer的getTableCellRendererComponent()被调用 | 无效,prepareRenderer()仍抛 NPE | JDK 8 的渲染器委托链增加UIManager.getLookAndFeelDefaults()检查,绕过自定义 renderer |
验证脚本(保存为TableNullTest.java):
import javax.swing.*; import javax.swing.table.DefaultTableModel; public class TableNullTest { public static void main(String[] args) { JFrame frame = new JFrame("JTable Null Test"); JTable table = new JTable(new DefaultTableModel(new Object[][]{ {"Row1", null}, {"Row2", "Value"} }, new String[]{"Col1", "Col2"})); // 强制触发 prepareRenderer SwingUtilities.invokeLater(() -> { try { table.prepareRenderer(table.getCellRenderer(0,1), 0, 1); System.out.println("JDK 7u5: No NPE, works"); } catch (Exception e) { System.out.println("JDK 8+: NPE thrown: " + e.getClass().getSimpleName()); } }); frame.add(new JScrollPane(table)); frame.setSize(400, 200); frame.setVisible(true); } }5.2 提取SwingLabs组件到现代项目:JXTable的最小化移植方案
SwingSet2.jar依赖swingx-1.6.2.jar,该库虽已停止维护,但JXTable的核心能力(排序、过滤、列冻结)在 JDK 7u5 下无可替代。将其迁移到 JDK 11+ 项目需三步:
- 下载兼容版
swingx:使用swingx-1.6.5-2(修复了 JDK 9+ 模块化问题),Maven 坐标:
<dependency> <groupId>org.swinglabs</groupId> <artifactId>swingx</artifactId> <version>1.6.5-2</version> </dependency>- 替换
SwingSet2中的JXTable初始化逻辑:
原 JDK 7u5 代码:
JXTable table = new JXTable(model); table.setColumnControlVisible(true); // 显示列选择器JDK 11+ 等效代码(需添加SwingXUtils工具类):
JXTable table = new JXTable(model); table.setColumnSelectionAllowed(true); // 列控制需手动添加 JXTableHeader table.setTableHeader(new JXTableHeader(table.getColumnModel()));- 修复渲染器兼容性:
JXTable的Highlighter在 JDK 11+ 需显式设置HighlighterFactory:
table.setHighlighters(HighlighterFactory.createAlternateStriping(Color.LIGHT_GRAY, Color.WHITE));从那以后我每次要验证某个 Swing 组件在旧版 JDK 下的真实行为,都强制走一遍
jdk-7u5-windows-x64-demos的原生启动流程 —— 不是信不过文档,而是信得过当年 Oracle 工程师写在sun.*包里的每一行注释。这些 demo 不是古董,是 Java GUI 演化史上的校准器。希望帮到你。
本文还有配套的精品资源,点击获取