欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

自制Java工具實現(xiàn)翻譯鼠標選中文本

 更新時間:2024年01月03日 08:29:22   作者:赤旗  
這篇文章主要為大家詳細介紹了如何自制Java工具實現(xiàn)ctrl+c+c翻譯鼠標選中文本,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

前言

本功能的實現(xiàn)基于這篇筆記java實現(xiàn)全局監(jiān)聽鍵盤,本文閱讀過程中有疑惑都可以查看此筆記

實現(xiàn)思路:檢測到按壓ctrl +c +c 后,獲取當前剪切板文字,調用百度翻譯api。

實現(xiàn)結果:

完整代碼在最后

實現(xiàn)過程

1 監(jiān)控ctrl +c +c

在當前demo的功能中我們可以看到,當按壓鍵盤時會調用nativeKeyPressed方法,并會打印當前按下的按鈕字符串。

我們去掉一些打印的干擾:去除release和type的打印,以及press打印的前綴

此時就只會打印我們的按鍵

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

效果:

2 獲取剪切板內容

在我們進行ctrl+c+c的操作過程中,第一個ctrl+c就會將鼠標選擇的內容放到剪切板里,此時我們獲取剪切板的內容,之后再用這個內容調用翻譯api即可。 創(chuàng)建一個剪切板工具類

/**
 * 剪切板工具類
 */
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 "剪切板無文本值";
    }
}

在代碼中調用:

效果:

3 調用百度翻譯api

注冊賬號,開通服務

搜索百度翻譯開放平臺,注冊賬號,實名認證后,可以申請高級版用戶 標準版:注冊,未實名 高級版:注冊,實名 尊享版:企業(yè)認證

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

詳細見文檔

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

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

以下是調用方法的代碼實現(xiàn),我們創(chuàng)建一個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;

    /**
     * 有參構造
     * @param appid appid
     * @param securityKey 密鑰
     */
    public TransApi(String appid, String securityKey) {
        this.appid = appid;
        this.securityKey = securityKey;
    }
    
    /**
     * 調用方法
     * @param query 翻譯內容
     * @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 翻譯內容
     * @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;
    }
}

其中調用接口的HttpUtil和加密的DigestUtil使用的是hutool中的類 hutool包的地址:

<dependency>
  <groupId>cn.hutool</groupId>
  <artifactId>hutool-all</artifactId>
  <version>5.8.24</version>
</dependency>

ctrl+c+c獲取剪切板內容并調用翻譯接口

GlobalKeyListenerExample類中添加TransApi類的初始化:

在獲取剪切板內容后,將剪切板的內容調用翻譯接口,并處理返回數(shù)據(jù)

運行效果

我們看到這里,已經初步完成了ctrl+c+c進行翻譯的功能,剩下的就是進行一些小優(yōu)化,如生成窗口展示數(shù)據(jù)

4 小窗口展示剪切板內容和翻譯內容

因為筆者對java的gui窗口不是很了解,這里使用chatgpt工具生成了小窗口,可能有些簡陋,讀者可以自己美化一下 新建一個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();
        //設置字體大小
        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:

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

運行:

完整代碼

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);
            //打印剪切板內容
            System.out.println("剪切板內容為:" + ClipBoardUtil.getClipboardText());
            //調用翻譯接口
            String jsonStr = api.getTransResult(ClipBoardUtil.getClipboardText(), "auto", "zh");
            // 解析JSON字符串
            JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
            // 獲取trans_result數(shù)組中的第一個元素
            JSONObject transResult = jsonObject.getJSONArray("trans_result").getJSONObject(0);
            // 獲取dst中的內容并轉換成中文
            String dst = transResult.getStr("dst");
            String chineseDst = UnicodeUtil.toString(dst);

            System.out.println("翻譯:"+chineseDst);


            window.clearText();
            window.writeText("剪切板內容為:" + 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());
    }
}

到此這篇關于自制Java工具實現(xiàn)翻譯鼠標選中文本的文章就介紹到這了,更多相關Java翻譯文本內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring?Data?JPA實現(xiàn)持久化存儲數(shù)據(jù)到數(shù)據(jù)庫的示例代碼

    Spring?Data?JPA實現(xiàn)持久化存儲數(shù)據(jù)到數(shù)據(jù)庫的示例代碼

    Spring Data JPA是Spring基于JPA規(guī)范的基礎上封裝的?套 JPA 應?框架,可使開發(fā)者?極簡的代碼即可實現(xiàn)對數(shù)據(jù)庫的訪問和操作。本文我們來了解如何用Spring?Data?JPA框架實現(xiàn)數(shù)據(jù)持久化存儲到數(shù)據(jù)庫,感興趣的可以了解一下
    2022-04-04
  • 通過代碼實例深入解析Java重寫和重載

    通過代碼實例深入解析Java重寫和重載

    這篇文章主要介紹了通過代碼實例深入解析Java重寫和重載,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • java實現(xiàn)直線分形山脈

    java實現(xiàn)直線分形山脈

    這篇文章主要為大家詳細介紹了java實現(xiàn)直線分形山脈,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring Boot jar可執(zhí)行原理的徹底分析

    Spring Boot jar可執(zhí)行原理的徹底分析

    這篇文章主要給大家介紹了關于Spring Boot jar可執(zhí)行原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • 解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected type錯誤

    解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected

    這篇文章主要介紹了解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected type錯誤的相關資料,需要的朋友可以參考下
    2017-02-02
  • java正則表達式提取數(shù)字的方法實例

    java正則表達式提取數(shù)字的方法實例

    這篇文章主要介紹了java正則表達式提取數(shù)字的方法,還有去除字符串數(shù)字的方法,大家參考使用吧
    2013-12-12
  • java如何創(chuàng)建一個jdbc程序詳解

    java如何創(chuàng)建一個jdbc程序詳解

    使用Java程序來操作數(shù)據(jù)庫,后者更加直接的話就是使用Java程序來發(fā)送SQL語句的技術稱之為:JDBC。下面這篇文章主要給大家介紹了關于利用java如何創(chuàng)建一個jdbc程序的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • 淺談java中String與StringBuffer的不同

    淺談java中String與StringBuffer的不同

    String在棧中,StringBuffer在堆中!所以String是不可變的,數(shù)據(jù)是共享的。StringBuffer都是獨占的,是可變的(因為每次都是創(chuàng)建新的對象?。?/div> 2015-11-11
  • icePDF去水印的方法(推薦)

    icePDF去水印的方法(推薦)

    下面小編就為大家?guī)硪黄猧cePDF去水印的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Java使用aspose實現(xiàn)pdf轉word

    Java使用aspose實現(xiàn)pdf轉word

    Aspose是一套強大的文檔處理工具,被超過80%的財富100強公司信賴,用于在應用程序中創(chuàng)建、編輯、導出和轉換100多種文件格式,本文將給大家介紹Java使用aspose實現(xiàn)pdf轉word的操作方法,需要的朋友可以參考下
    2025-02-02

最新評論