自制Java工具實(shí)現(xiàn)翻譯鼠標(biāo)選中文本
前言
本功能的實(shí)現(xiàn)基于這篇筆記java實(shí)現(xiàn)全局監(jiān)聽鍵盤,本文閱讀過程中有疑惑都可以查看此筆記
實(shí)現(xiàn)思路:檢測到按壓ctrl +c +c 后,獲取當(dāng)前剪切板文字,調(diào)用百度翻譯api。
實(shí)現(xiàn)結(jié)果:

完整代碼在最后
實(shí)現(xiàn)過程
1 監(jiān)控ctrl +c +c
在當(dāng)前demo的功能中我們可以看到,當(dāng)按壓鍵盤時(shí)會調(diào)用nativeKeyPressed方法,并會打印當(dāng)前按下的按鈕字符串。

我們?nèi)サ粢恍┐蛴〉母蓴_:去除release和type的打印,以及press打印的前綴

此時(shí)就只會打印我們的按鍵

現(xiàn)在去實(shí)現(xiàn):當(dāng)連續(xù)按壓ctrl+c+c時(shí),打印"你按下了ctrl+c+c哦" 思路:初始設(shè)置一個(gè)key字符串為"",當(dāng)檢測到按壓ctrl時(shí),設(shè)置key為"Ctrl",當(dāng)不是Ctrl時(shí),key拼接本次按壓的按鍵,然后和"CtrlCC"做比較。如果相同,則說明用戶連續(xù)按壓了ctrl+c+c; 代碼實(shí)現(xiàn)(紅框內(nèi)為添加的代碼):

效果:

2 獲取剪切板內(nèi)容
在我們進(jìn)行ctrl+c+c的操作過程中,第一個(gè)ctrl+c就會將鼠標(biāo)選擇的內(nèi)容放到剪切板里,此時(shí)我們獲取剪切板的內(nèi)容,之后再用這個(gè)內(nèi)容調(diào)用翻譯api即可。 創(chuàng)建一個(gè)剪切板工具類
/**
* 剪切板工具類
*/
public class ClipBoardUtil {
public static String getClipboardText() {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//從系統(tǒng)剪切板中獲取數(shù)據(jù)
Transferable content = clipboard.getContents(null);
//判斷是否為文本類型
if (content.isDataFlavorSupported(DataFlavor.stringFlavor)) {
//從數(shù)據(jù)中獲取文本值
String text = null;
try {
text = (String) content.getTransferData(DataFlavor.stringFlavor);
} catch (Exception e) {
}
if (text == null) {
return "剪切板為空";
}
return text;
}
return "剪切板無文本值";
}
}
在代碼中調(diào)用:

效果:

3 調(diào)用百度翻譯api
注冊賬號,開通服務(wù)
搜索百度翻譯開放平臺,注冊賬號,實(shí)名認(rèn)證后,可以申請高級版用戶 標(biāo)準(zhǔn)版:注冊,未實(shí)名 高級版:注冊,實(shí)名 尊享版:企業(yè)認(rèn)證

高級版每個(gè)月有100萬字符的免費(fèi)調(diào)用量,對于個(gè)人使用的話綽綽有余了。 注冊后,在管理控制臺中開通文本翻譯服務(wù)

詳細(xì)見文檔:

根據(jù)文檔,編寫代碼

其中appid和密鑰,在我們的管理控制臺中

以下是調(diào)用方法的代碼實(shí)現(xiàn),我們創(chuàng)建一個(gè)TransApi類
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpUtil;
import java.util.HashMap;
import java.util.Map;
public class TransApi {
private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate";
private String appid;
private String securityKey;
/**
* 有參構(gòu)造
* @param appid appid
* @param securityKey 密鑰
*/
public TransApi(String appid, String securityKey) {
this.appid = appid;
this.securityKey = securityKey;
}
/**
* 調(diào)用方法
* @param query 翻譯內(nèi)容
* @param from 來源語言
* @param to 翻譯語言
* @return 返回參數(shù)
*/
public String getTransResult(String query, String from, String to) {
Map<String, Object> params = this.buildParams(query, from, to);
return HttpUtil.get("http://api.fanyi.baidu.com/api/trans/vip/translate", params);
}
/**
* 初始化參數(shù)
* @param query 翻譯內(nèi)容
* @param from 來源語言
* @param to 翻譯語言
* @return
*/
private Map<String, Object> buildParams(String query, String from, String to) {
Map<String, Object> params = new HashMap();
params.put("q", query);
params.put("from", from);
params.put("to", to);
params.put("appid", this.appid);
String salt = String.valueOf(System.currentTimeMillis());
params.put("salt", salt);
String src = this.appid + query + salt + this.securityKey;
//MD5加密
params.put("sign", DigestUtil.md5Hex(src));
return params;
}
}
其中調(diào)用接口的HttpUtil和加密的DigestUtil使用的是hutool中的類 hutool包的地址:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.24</version> </dependency>
ctrl+c+c獲取剪切板內(nèi)容并調(diào)用翻譯接口
在GlobalKeyListenerExample類中添加TransApi類的初始化:

在獲取剪切板內(nèi)容后,將剪切板的內(nèi)容調(diào)用翻譯接口,并處理返回?cái)?shù)據(jù)

運(yùn)行效果

我們看到這里,已經(jīng)初步完成了ctrl+c+c進(jìn)行翻譯的功能,剩下的就是進(jìn)行一些小優(yōu)化,如生成窗口展示數(shù)據(jù)
4 小窗口展示剪切板內(nèi)容和翻譯內(nèi)容
因?yàn)楣P者對java的gui窗口不是很了解,這里使用chatgpt工具生成了小窗口,可能有些簡陋,讀者可以自己美化一下 新建一個(gè)MyWindows類
import javax.swing.*;
import java.awt.*;
public class MyWindow extends JFrame {
private JTextArea textArea;
public MyWindow() {
setTitle("Text Window");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea = new JTextArea();
//設(shè)置字體大小
textArea.setFont(new Font("SimSun", Font.PLAIN, 16));
// 自動換行
textArea.setLineWrap(true);
// 斷行不斷字
textArea.setWrapStyleWord(true);
JPanel panel = new JPanel();
setVisible(true);
add(textArea, "Center");
add(panel, "South");
}
//寫入文本
public void writeText(String text) {
textArea.append(text + "\n");
}
//清楚文本
public void clearText() {
textArea.setText("");
}
public static void main(String[] args) {
MyWindow window = new MyWindow();
window.setVisible(true);
}
}
在GlobalKeyListenerExample類中初始化MyWindow:

在獲取翻譯后,清除原來的文字,寫入新的文字:

運(yùn)行: 
完整代碼
ClipBoardUtil類,TransApi類,MyWindow類上文已給出完整代碼。 GlobalKeyListenerExample類:
import cn.hutool.core.text.UnicodeUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.github.kwhat.jnativehook.GlobalScreen;
import com.github.kwhat.jnativehook.NativeHookException;
import com.github.kwhat.jnativehook.keyboard.NativeKeyEvent;
import com.github.kwhat.jnativehook.keyboard.NativeKeyListener;
import com.icepeach.Utils.ClipBoardUtil;
import com.icepeach.Utils.GUI.MyWindow;
public class GlobalKeyListenerExample implements NativeKeyListener {
String key = "";
private static final String APP_ID = "你的appid";
private static final String SECURITY_KEY = "你的密鑰";
TransApi api = new TransApi(APP_ID, SECURITY_KEY);
MyWindow window = new MyWindow();
public void nativeKeyPressed(NativeKeyEvent e) {
if ("Ctrl".equals(NativeKeyEvent.getKeyText(e.getKeyCode()))) {
key = new String("Ctrl");
} else {
key += NativeKeyEvent.getKeyText(e.getKeyCode());
}
if ("CtrlCC".equals(key)) {
window.setVisible(true);
//打印剪切板內(nèi)容
System.out.println("剪切板內(nèi)容為:" + ClipBoardUtil.getClipboardText());
//調(diào)用翻譯接口
String jsonStr = api.getTransResult(ClipBoardUtil.getClipboardText(), "auto", "zh");
// 解析JSON字符串
JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
// 獲取trans_result數(shù)組中的第一個(gè)元素
JSONObject transResult = jsonObject.getJSONArray("trans_result").getJSONObject(0);
// 獲取dst中的內(nèi)容并轉(zhuǎn)換成中文
String dst = transResult.getStr("dst");
String chineseDst = UnicodeUtil.toString(dst);
System.out.println("翻譯:"+chineseDst);
window.clearText();
window.writeText("剪切板內(nèi)容為:" + ClipBoardUtil.getClipboardText());
window.writeText("翻譯:"+chineseDst);
}
if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
try {
GlobalScreen.unregisterNativeHook();
} catch (NativeHookException nativeHookException) {
nativeHookException.printStackTrace();
}
}
}
public void nativeKeyReleased(NativeKeyEvent e) {
// System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
public void nativeKeyTyped(NativeKeyEvent e) {
// System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
} catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
System.exit(1);
}
GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
}
}到此這篇關(guān)于自制Java工具實(shí)現(xiàn)翻譯鼠標(biāo)選中文本的文章就介紹到這了,更多相關(guān)Java翻譯文本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Data?JPA實(shí)現(xiàn)持久化存儲數(shù)據(jù)到數(shù)據(jù)庫的示例代碼
Spring Data JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套 JPA 應(yīng)?框架,可使開發(fā)者?極簡的代碼即可實(shí)現(xiàn)對數(shù)據(jù)庫的訪問和操作。本文我們來了解如何用Spring?Data?JPA框架實(shí)現(xiàn)數(shù)據(jù)持久化存儲到數(shù)據(jù)庫,感興趣的可以了解一下2022-04-04
Spring Boot jar可執(zhí)行原理的徹底分析
這篇文章主要給大家介紹了關(guān)于Spring Boot jar可執(zhí)行原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected
這篇文章主要介紹了解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected type錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2017-02-02
java正則表達(dá)式提取數(shù)字的方法實(shí)例
這篇文章主要介紹了java正則表達(dá)式提取數(shù)字的方法,還有去除字符串?dāng)?shù)字的方法,大家參考使用吧2013-12-12
java如何創(chuàng)建一個(gè)jdbc程序詳解
使用Java程序來操作數(shù)據(jù)庫,后者更加直接的話就是使用Java程序來發(fā)送SQL語句的技術(shù)稱之為:JDBC。下面這篇文章主要給大家介紹了關(guān)于利用java如何創(chuàng)建一個(gè)jdbc程序的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11
String在棧中,StringBuffer在堆中!所以String是不可變的,數(shù)據(jù)是共享的。StringBuffer都是獨(dú)占的,是可變的(因?yàn)槊看味际莿?chuàng)建新的對象?。?/div> 2015-11-11
Java使用aspose實(shí)現(xiàn)pdf轉(zhuǎn)word
Aspose是一套強(qiáng)大的文檔處理工具,被超過80%的財(cái)富100強(qiáng)公司信賴,用于在應(yīng)用程序中創(chuàng)建、編輯、導(dǎo)出和轉(zhuǎn)換100多種文件格式,本文將給大家介紹Java使用aspose實(shí)現(xiàn)pdf轉(zhuǎn)word的操作方法,需要的朋友可以參考下2025-02-02最新評論

