自制Java工具:Ctrl+C+C快速翻译鼠标选中文本实践指南
2025.09.19 13:11浏览量:3简介:本文介绍如何通过Java实现一个自定义工具,监听Ctrl+C+C快捷键并翻译鼠标选中的文本,提升跨语言工作效率。
引言
在日常开发或办公场景中,频繁切换翻译工具查看外文资料会打断工作流。本文将通过Java实现一个轻量级工具,监听Ctrl+C+C组合键(避免与系统复制冲突),自动捕获鼠标选中文本并调用翻译API,实现无缝翻译体验。该方案适用于Windows/Linux/macOS,无需安装额外软件,适合开发者或跨语言办公场景。
一、技术选型与原理
1.1 核心组件
- Java AWT/Swing:监听全局键盘事件与剪贴板操作
- Robot类:模拟键盘输入(用于特殊场景)
- HTTP客户端(如OkHttp):调用翻译API
- 正则表达式:解析选中文本中的可翻译内容
1.2 工作原理
- 监听全局快捷键:通过
GlobalScreen库(需jnativehook依赖)捕获Ctrl+C+C组合键。 - 获取选中文本:调用
Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor)读取剪贴板内容。 - 文本预处理:过滤非文本内容(如图片),提取有效翻译段落。
- 调用翻译API:通过HTTP请求发送文本至翻译服务(如Google Translate免费接口或DeepL)。
- 结果显示:将翻译结果弹窗展示或写回剪贴板。
二、实现步骤
2.1 环境准备
依赖管理:
<!-- Maven依赖 --><dependency><groupId>com.github.kwhat</groupId><artifactId>jnativehook</artifactId><version>2.2.2</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.10.0</version></dependency>
权限配置:
- Windows:需以管理员权限运行(监听全局事件需权限)。
- Linux/macOS:需配置
x11权限或通过sudo启动。
2.2 核心代码实现
2.2.1 监听快捷键
import org.jnativehook.GlobalScreen;import org.jnativehook.NativeHookException;import org.jnativehook.keyboard.NativeKeyEvent;import org.jnativehook.keyboard.NativeKeyListener;public class HotkeyListener implements NativeKeyListener {private static boolean isCtrlPressed = false;@Overridepublic void nativeKeyPressed(NativeKeyEvent e) {if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L) {isCtrlPressed = true;} else if (isCtrlPressed && e.getKeyCode() == NativeKeyEvent.VC_C) {// 第二次按下Ctrl+C时触发translateSelectedText();isCtrlPressed = false;}}@Overridepublic void nativeKeyReleased(NativeKeyEvent e) {if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L) {isCtrlPressed = false;}}public static void registerGlobalHotkey() {try {GlobalScreen.registerNativeHook();GlobalScreen.addNativeKeyListener(new HotkeyListener());} catch (NativeHookException ex) {System.err.println("注册全局监听失败: " + ex.getMessage());}}}
2.2.2 获取选中文本
import java.awt.*;import java.awt.datatransfer.*;public class ClipboardUtils {public static String getSelectedText() {try {Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();return (String) clipboard.getData(DataFlavor.stringFlavor);} catch (UnsupportedFlavorException | IOException e) {return null; // 非文本内容或获取失败}}}
2.2.3 调用翻译API(以Google Translate为例)
import okhttp3.*;public class Translator {private static final String API_URL = "https://translate.googleapis.com/translate_a/single";private static final String API_KEY = "YOUR_API_KEY"; // 需替换为有效Keypublic static String translate(String text, String targetLang) throws IOException {OkHttpClient client = new OkHttpClient();RequestBody body = new FormBody.Builder().add("q", text).add("target", targetLang).add("key", API_KEY).build();Request request = new Request.Builder().url(API_URL).post(body).build();try (Response response = client.newCall(request).execute()) {// 解析JSON响应(示例简化,实际需用JSON库)String json = response.body().string();// 假设返回格式为 {"data":{"translations":[{"translatedText":"..."}]}}return json.split("\"translatedText\":\"")[1].split("\"")[0];}}}
2.2.4 主程序集成
import javax.swing.*;public class TranslationTool {public static void main(String[] args) {// 注册快捷键监听HotkeyListener.registerGlobalHotkey();// 显示系统托盘图标(可选)if (SystemTray.isSupported()) {SystemTray tray = SystemTray.getSystemTray();Image image = Toolkit.getDefaultToolkit().getImage("icon.png");PopupMenu menu = new PopupMenu();MenuItem exitItem = new MenuItem("退出");exitItem.addActionListener(e -> System.exit(0));menu.add(exitItem);TrayIcon trayIcon = new TrayIcon(image, "翻译工具", menu);trayIcon.addActionListener(e -> showHelpDialog());tray.add(trayIcon);}// 保持程序运行while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}private static void translateSelectedText() {String selectedText = ClipboardUtils.getSelectedText();if (selectedText != null && !selectedText.isEmpty()) {try {String translated = Translator.translate(selectedText, "zh-CN");JOptionPane.showMessageDialog(null, translated, "翻译结果", JOptionPane.INFORMATION_MESSAGE);} catch (IOException e) {JOptionPane.showMessageDialog(null, "翻译失败: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);}}}private static void showHelpDialog() {JOptionPane.showMessageDialog(null, "按Ctrl+C+C翻译选中文本", "帮助", JOptionPane.INFORMATION_MESSAGE);}}
三、优化与扩展
3.1 性能优化
- 异步处理:使用
SwingWorker避免翻译API调用阻塞UI线程。 - 缓存机制:对重复文本缓存翻译结果,减少API调用次数。
- 节流控制:限制单位时间内翻译请求频率,避免触发API限流。
3.2 功能扩展
- 多语言支持:通过配置文件动态加载目标语言。
- OCR集成:结合Tesseract OCR识别图片中的文字。
- 语音朗读:调用
javax.speech实现翻译结果语音播报。
3.3 错误处理
- 网络异常:捕获
IOException并提供重试机制。 - API密钥失效:检测HTTP 403错误并提示用户更新密钥。
- 剪贴板冲突:处理
IllegalStateException(如其他程序锁定剪贴板)。
四、部署与使用
打包为JAR:
<!-- Maven配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.6.0</version><configuration><archive><manifest><mainClass>TranslationTool</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration></plugin>
运行命令:
java -jar translation-tool.jar开机自启:
- Windows:创建快捷方式至
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup。 - Linux:添加
@java -jar /path/to/translation-tool.jar至~/.config/autostart/。
- Windows:创建快捷方式至
五、替代方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 本工具(Java) | 跨平台、可定制性强 | 需Java环境,内存占用较高 |
| AutoHotkey | 轻量级,无需编程 | 仅限Windows,功能扩展性有限 |
| Electron应用 | 界面美观,支持复杂交互 | 打包体积大,启动速度慢 |
结论
本文实现的Java工具通过监听Ctrl+C+C快捷键,结合剪贴板操作与翻译API,提供了高效、无感的文本翻译体验。开发者可根据实际需求扩展功能(如添加OCR、语音支持),或将其集成至IDE插件中。对于非技术用户,建议使用打包后的JAR文件配合开机自启,实现“一键安装,永久使用”的便捷体验。

发表评论
登录后可评论,请前往 登录 或 注册