
本文介绍如何通过 beanshell 脚本调用 jedit 的 swing 渲染机制,将当前文本区域(textarea)完整渲染为高质量 png 位图,支持快捷键触发、外部命令调用及路径自定义。
本文介绍如何通过 beanshell 脚本调用 jedit 的 swing 渲染机制,将当前文本区域(textarea)完整渲染为高质量 png 位图,支持快捷键触发、外部命令调用及路径自定义。
jEdit 作为基于 Java Swing 构建的可扩展文本编辑器,其 UI 组件(如 textArea)本质上是标准的 JComponent,因此可直接利用 AWT/Swing 的绘图 API 进行离屏渲染。核心思路是:创建一个与文本区域尺寸一致的 BufferedImage,获取其 Graphics 上下文,并调用 textArea.paint(g) 强制重绘到该图像缓冲区,最后使用 ImageIO 写入 PNG 文件。
以下为完整可用的 BeanShell 脚本(.bsh 文件):
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import javax.swing.JFileChooser;
// 获取当前活动文本区域(确保在编辑器上下文中运行)
if (textArea == null) {
Macros.error(view, "No active text area found.");
return;
}
// 可选:弹出文件保存对话框(增强交互性)
JFileChooser fc = new JFileChooser();
fc.setDialogTitle("Save Text Area as PNG");
fc.setSelectedFile(new File("jedit-textarea-" + System.currentTimeMillis() + ".png"));
int result = fc.showSaveDialog(view);
if (result != JFileChooser.APPROVE_OPTION) return;
File outputFile = fc.getSelectedFile();
if (!outputFile.getName().toLowerCase().endsWith(".png")) {
outputFile = new File(outputFile.getParent(), outputFile.getName() + ".png");
}
// 创建 ARGB 图像缓冲区(支持透明背景)
BufferedImage img = new BufferedImage(
textArea.getWidth(),
textArea.getHeight(),
BufferedImage.TYPE_INT_ARGB
);
// 执行离屏渲染
Graphics g = img.getGraphics();
try {
textArea.paint(g); // 注意:此调用依赖组件已布局完成且可见
} finally {
g.dispose();
}
// 写入 PNG 文件
try {
ImageIO.write(img, "png", outputFile);
Macros.message(view, "Screenshot saved to: " + outputFile.getAbsolutePath());
} catch (Exception e) {
Macros.error(view, "Failed to save image: " + e.getMessage());
}
✅ 使用方式:
- 将脚本保存为 snapshot-textArea.bsh,放入 jEdit/macros/ 目录;
- 在 jEdit 中通过 Macros → Load Macros 加载,或重启后在 Macros 菜单中找到;
- 可右键菜单绑定快捷键(Utilities → Global Options → Shortcuts),提升效率;
- 也可从终端调用:jedit -run=/path/to/snapshot-textArea.bsh(需确保 jEdit 处于前台且有打开文档)。
⚠️ 注意事项:
- 脚本仅捕获当前可视区域(即 textArea.getWidth()/getHeight() 所示尺寸),不包含滚动未显示内容。如需全文档截图,需先调整视图或改用 JViewport+scrollRectToVisible 等方案;
- textArea.paint(g) 是“快照式”绘制,不触发事件或更新状态,安全可靠;
- PNG 使用 TYPE_INT_ARGB,保留抗锯齿字体和主题配色(包括暗色模式下的语法高亮);
- 若导出黑屏,请检查 textArea 是否已初始化完成(建议在 View 或 Buffer 激活后执行)。
该方法具备通用性——只需替换 textArea 为任意 JComponent 实例(如 dockableWindow.getComponent()),即可对侧边栏、控制台等 Swing 子组件进行同类截图,是自动化文档生成、UI 测试与教学演示的实用技巧。










