自制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í)會(huì)調(diào)用nativeKeyPressed
方法,并會(huì)打印當(dāng)前按下的按鈕字符串。
我們?nèi)サ粢恍┐蛴〉母蓴_:去除release和type的打印,以及press打印的前綴
此時(shí)就只會(huì)打印我們的按鍵
現(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就會(huì)將鼠標(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
注冊賬號(hào),開通服務(wù)
搜索百度翻譯開放平臺(tái),注冊賬號(hào),實(shí)名認(rèn)證后,可以申請高級版用戶 標(biāo)準(zhǔn)版:注冊,未實(shí)名 高級版:注冊,實(shí)名 尊享版:企業(yè)認(rèn)證
高級版每個(gè)月有100萬字符的免費(fèi)調(diào)用量,對于個(gè)人使用的話綽綽有余了。 注冊后,在管理控制臺(tái)中開通文本翻譯服務(wù)
詳細(xì)見文檔:
根據(jù)文檔,編寫代碼
其中appid和密鑰,在我們的管理控制臺(tái)中
以下是調(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)); // 自動(dòng)換行 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)持久化存儲(chǔ)數(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ù)持久化存儲(chǔ)到數(shù)據(jù)庫,感興趣的可以了解一下2022-04-04Spring 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-02java正則表達(dá)式提取數(shù)字的方法實(shí)例
這篇文章主要介紹了java正則表達(dá)式提取數(shù)字的方法,還有去除字符串?dāng)?shù)字的方法,大家參考使用吧2013-12-12java如何創(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最新評論