最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

本功能的實(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));
        // 自動(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)文章

  • Java列出2到100之間所有素?cái)?shù)的方法

    Java列出2到100之間所有素?cái)?shù)的方法

    這篇文章主要介紹了Java列出2到100之間所有素?cái)?shù)的方法,涉及java數(shù)值運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • MyBatis-Plus配置未生效的問題及解決

    MyBatis-Plus配置未生效的問題及解決

    本文主要探討了在使用MyBatis-Plus進(jìn)行數(shù)據(jù)庫操作時(shí)遇到的問題,包括SQL語句未生效、Mapper接口未掃描、屬性未注入、Bean未注冊等問題,通過分析SpringBoot的配置類加載機(jī)制,本文提出了兩種解決方案:添加@Configuration注解和使用AutoConfiguration.imports文件
    2025-12-12
  • 基于Jackson實(shí)現(xiàn)API接口數(shù)據(jù)脫敏的示例詳解

    基于Jackson實(shí)現(xiàn)API接口數(shù)據(jù)脫敏的示例詳解

    用戶的一些敏感數(shù)據(jù),例如手機(jī)號、郵箱、身份證等信息,在數(shù)據(jù)庫以明文存儲,但在接口返回?cái)?shù)據(jù)給瀏覽器(或三方客戶端)時(shí),希望對這些敏感數(shù)據(jù)進(jìn)行脫敏,所以本文就給大家介紹以惡如何利用Jackson實(shí)現(xiàn)API接口數(shù)據(jù)脫敏,需要的朋友可以參考下
    2023-08-08
  • 只需兩步實(shí)現(xiàn)Eclipse+Maven快速構(gòu)建第一個(gè)Spring Boot項(xiàng)目

    只需兩步實(shí)現(xiàn)Eclipse+Maven快速構(gòu)建第一個(gè)Spring Boot項(xiàng)目

    這篇文章主要介紹了只需兩步實(shí)現(xiàn)Eclipse+Maven快速構(gòu)建第一個(gè)Spring Boot項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • java軟引用在瀏覽器使用實(shí)例講解

    java軟引用在瀏覽器使用實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于java軟引用在瀏覽器使用實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • Spring中的三級緩存與循環(huán)依賴詳解

    Spring中的三級緩存與循環(huán)依賴詳解

    Spring三級緩存是Spring框架中用于解決循環(huán)依賴問題的一種機(jī)制,這篇文章主要介紹了Spring三級緩存與循環(huán)依賴的相關(guān)知識,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • 最新評論

    晋江市| 山阴县| 彰化县| 临湘市| 安新县| 周至县| 光山县| 司法| 六安市| 米易县| 潍坊市| 鹤山市| 平塘县| 阿克| 临高县| 丽水市| 即墨市| 隆回县| 金平| 沅江市| 龙陵县| 广元市| 鄂州市| 永顺县| 游戏| 察隅县| 杭州市| 东台市| 临湘市| 赤水市| 韶山市| 青河县| 广饶县| 随州市| 巨鹿县| 开封市| 富川| 明光市| 垫江县| 深泽县| 无棣县|