平时看英文文档或者查询资料的时候,遇到了不懂的单词,就要去百度,然后就会很麻烦。于是就想到用Java写一个及时翻译的小工具!

预期的实现效果:
双击选中一个单词,按下Ctrl+C进行复制
然后马上显示出对应单词的中文翻译

首先基本思路是这样的:

  • 首先获取系统剪切板的内容
  • 将该内容发送到网页上,然后获取网页的源码,查找到对应的中文解释
  • 将中文翻译显示出来

以上就是基本的思路!但是实际操作的时候还是遇到了很大的困难的。

先写两个接口

得到剪切板的内容

这个并不是很困难,毕竟java有提供对应的API,代码如下:

package translate;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;public class ClipboradUtils {protected static String getClipboardText() throws Exception{Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();//获取系统剪贴板// 获取剪切板中的内容Transferable clipT = clip.getContents(null);if (clipT != null) {// 检查内容是否是文本类型if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))return (String)clipT.getTransferData(DataFlavor.stringFlavor); }return null;}
}

以上是放在一个工具类,做成静态函数方便调用!

获取网页源码

首先想到是就是去百度翻译

我们在这里翻译单词 blue
我们看地址栏http://fanyi.baidu.com/?aldtype=16047#en/zh/blue,刚好我们要翻译的单词就在最后,所以只要爬取页面http://fanyi.baidu.com/?aldtype=16047#en/zh/待查单词的源代码,然后做一些筛选就可以了!
然后事情进展的却并不是那么的顺利,百度的这个应该是为了防止爬取,所以翻译的操作应该是Dom操作,源代码上面毫无翻译痕迹。
这个方法就终止了。

然后想到的是百度翻译是否有开放接口
果然,百度翻译提供了开放的接口,但是貌似要收费。
http://api.fanyi.baidu.com/api/trans/product/index
当然,我建议大家用这个方法,毕竟人家公司也不容易,而且功能也相对很丰富。

但是,如果真的不想花钱就不行了吗?答案是否定的!

意外收获
我在百度直接搜索一个单词的是否发现也会出现对应的翻译!如下:

然后查看一下源代码,搜索蓝色,果然,源代码上面是有翻译结果的(偷笑)。

而且对应的翻译内容就在<span class="op_dict_text2"></span>之间!
百度搜索的url对应的是http://www.baidu.com/s?wd="搜索内容"

于是就可以把获取翻译内容的工具类写好了,代码如下:

package translate;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class GetHtmlContentUtils {private final static String PreUrl="http://www.baidu.com/s?wd=";                        //百度搜索URLprivate final static String TransResultStartFlag="<span class=\"op_dict_text2\">";      //翻译开始标签private final static String TransResultEndFlag="</span>";                               //翻译结束标签public static String getTranslateResult(String urlString) throws Exception {    //传入要搜索的单词URL url = new URL(PreUrl+urlString);            //生成完整的URL// 打开URLHttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();// 得到输入流,即获得了网页的内容BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));String preLine="";String line;int flag=1;// 读取输入流的数据,并显示String content="";          //翻译结果while ((line = reader.readLine()) != null) {            //获取翻译结果的算法if(preLine.indexOf(TransResultStartFlag)!=-1&&line.indexOf(TransResultEndFlag)==-1){content+=line.replaceAll(" | ", "")+"\n";   //去电源代码上面的半角以及全角字符flag=0;}if(line.indexOf(TransResultEndFlag)!=-1){flag=1;}if(flag==1){preLine=line;}}return content;//返回翻译结果}}

再写一个窗体界面

注:有了上面的核心算法,下面的其实都随意实现了!

界面实现

我设计的窗体界面如下:

简单说一下界面布局:最上面一个JTextFieldJCheckBox,下面是JTextArea

简单说一下各个控件的作用:
JTextField:显示待翻译的单词
JCheckBox:表示是从剪切板获取单词还是自己直接输入
JTextArea:显示翻译结果

实现思路

界面已经实现完成了,那么思路是什么呢?
我的思路是这样的:

  • 开启一个线程,将JTextField里面的值不断设置为剪切板里面的值
  • 如果JTextField里面的值改变了(剪切板的值改变了,也就是选中复制了新的单词),调用GetHtmlContentUtils 里面的方法获取翻译的结果,并显示!

对应代码如下:

package translate;import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;public class MainFrame extends JFrame implements Runnable {private JTextField srcContentTextField; // 记录剪切板的内容private JTextArea resContentTextField; // 记录翻译的内容private JCheckBox translateFlag;       //标记单词的获取来源//选中:手动输入    未选中:剪切板获取private Container topContainer;public MainFrame() {//初始化控件srcContentTextField = new JTextField(10);resContentTextField = new JTextArea();translateFlag = new JCheckBox();topContainer = new Container();}public void setMinWindowLayout() {// TODO Auto-generated method stub//布局设置resContentTextField.setBorder(new LineBorder(new java.awt.Color(127, 157, 185), 1, false));this.setLayout(new BorderLayout());this.add(this.resContentTextField);translateFlag.setToolTipText("手动输入取词");topContainer.setLayout(new BorderLayout());topContainer.add(srcContentTextField, BorderLayout.CENTER);topContainer.add(translateFlag, BorderLayout.EAST);this.add(this.topContainer, BorderLayout.NORTH);this.setResizable(false);translateFlag.addActionListener(new ActionListener() {//设置JCheckBox的监听@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif (translateFlag.isSelected()) {translateFlag.setToolTipText("自动复制取词");    //设置提示} else {translateFlag.setToolTipText("手动输入取词");}}});//监听JTextField里面内容改变的事件srcContentTextField.getDocument().addDocumentListener(new DocumentListener() {    @Overridepublic void changedUpdate(DocumentEvent arg0) {}@Overridepublic void insertUpdate(DocumentEvent arg0) {    //内容改变try {//调用接口获取翻译结果String result = GetHtmlContentUtils.getTranslateResult(srcContentTextField.getText());if (result == "")result = "!Sorry,未找到该词!";resContentTextField.setText(result);//显示翻译结果} catch (Exception e) {// TODO Auto-generated catch blockresContentTextField.setText("!Sorry,未找到该词!");}}@Overridepublic void removeUpdate(DocumentEvent arg0) {}});this.validate();}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {if (!translateFlag.isSelected()) {  //如果JCheckBox没有被选中,则从剪切板获取单词try {String content = ClipboradUtils.getClipboardText();srcContentTextField.setText(getSimpleWord(content));} catch (Exception e) { // TODO Auto-generated catch blocke.printStackTrace();}}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static String getSimpleWord(String content) {//去掉切板里面的一些特殊字符return content.replace(".", "").replace(",", "").replace("'", "").replace(":", "").replace(";", "").trim();}
}

接下来就是main函数了,代码如下:

package translate;import javax.swing.JFrame;public class TranslateTool {public static void main(String[] args) {MainFrame mainFrame = new MainFrame();mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);mainFrame.setBounds(300, 200, 400, 300);mainFrame.setVisible(true);mainFrame.setAlwaysOnTop(true);//设置在最顶层mainFrame.setMinWindowLayout();Thread t = new Thread(mainFrame);t.start();    //开启线程}
}

程序运行结果

随手翻译了下 public 关键字,感觉还是可以的!


以下是2017/03/19日的补充
从eclipse导出jar包时候,发现显示的翻译乱码了。
找了半天的资料,有以下两种解决方案:

  • 在控制台运行:

java -Dfile.encoding=utf-8 -jar
C:\Users\lenovo\Desktop\TranslateTool.jar(可执行jar的路径)

  • 设置JAVA_TOOL_OPTIONS:
    有关JAVA_TOOL_OPTIONS,参考:
    http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#tooloptions

现在就可以在系统环境变量中增加一个变量,变量名为:
JAVA_TOOL_OPTIONS, 变量值为:-Dfile.encoding=UTF-8

这样就基本可以解决乱码问题。如果你有好的解决方案,欢迎留言

软件下载地址:下载及时翻译工具

用Java做一个及时翻译工具相关推荐

  1. 自己动手做一个局域网聊天工具(一)

     作者:朱金灿 来源:http://blog.csdn.net/clever101 现在部门使用的局域网聊天工具是飞秋,但是飞秋总是不够稳定,有时会掉线.这使我萌生一个念头:做一个局域网聊天工具. ...

  2. 一个文本翻译工具的实现

    一.需求 一个文本翻译工具,功能类似于汇编器,能够把一些字符串(程序的助记符)翻译为其他的字符串或者数字,并打印到文本文件中.完成的功能如下: 1.        助记符翻译 2.        程序 ...

  3. 用Java做一个跳一跳辅助

    用Java做一个跳一跳辅助 Java跳一跳辅助 首先..让大家看下效果: 由于是闲着没事写的.也懒得看OpenCV的API了. 要用到的工具如下: adb+jdk 把adb添加到环境变量里就行.很简单 ...

  4. 如何复制java卡,使用java做一个简单的集卡程序

    使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...

  5. python实战扫码下载_实例:用 Python 做一个扫码工具

    原标题:实例:用 Python 做一个扫码工具 来自公众号: 新建文件夹X 链接:https://blog.csdn.net/ZackSock/article/details/108610957Pyt ...

  6. python屏幕录制与回放_使用Python来做一个屏幕录制工具的操作代码

    本文给大家分享使用Python来做一个屏幕录制工具,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方 ...

  7. java mysql点赞功能_用Java做一个类似于微博QQ空间点赞的功能-Fun言

    点赞是一个互动性很强的功能,网站加入点赞可以增强用户之间的亲密度,可以利用点赞排出受欢迎文章或者其他的列表,所以今天教大家如何做一个类似于微博.QQ空间的点赞功能 需求分析: 首先要明确这个功能是需要 ...

  8. 脚本录制软件python 按键精灵 tc_使用Python来做一个屏幕录制工具的操作代码

    一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方便后续开发同学定位.以前都是用ScreenToGif来录屏制作成动态图,偶尔的机会看到python也能实现.那就赶紧学习下. 二.效 ...

  9. 用Python做一个安全攻防工具:端口嗅探器(9)

    传送门 本系列原创博文传送门: 用Python做一个安全攻防工具:端口嗅探器(1) 用Python做一个安全攻防工具:端口嗅探器(2) 用Python做一个安全攻防工具:端口嗅探器(3) 用Pytho ...

  10. 简单用java做一个图书管理系统

    简单用java做一个图书管理系统 首先,我们创建一个View类当做它的视图页 package view;import service.BookService; import service.UserS ...

最新文章

  1. python 把2个列表或者2个元组转成字典
  2. Python的零基础超详细讲解(第四天)-Python的数据类型
  3. HTML5 Web SQL数据库
  4. 一个MIT计算机博士对数学的思考
  5. Python_Mix*OS模块,序列化模块种的json,pickle
  6. 前端学习(2229):react条件渲染实现登录
  7. virtualbox 启动时报Kernel driver not installed (rc=-1908) 的错误
  8. linux 怎么改系统字体,Linux下如何设置中文字体
  9. mysql修改表字段小数点精度,mysql – 如何配置Rails以在表单字段中以正确的精度输出小数?...
  10. UnityShader25:在Unity中实现泛光
  11. 3D MAX 倾斜物体对齐问题和坐标轴重置问题
  12. 构建简单的智能客服系统(三)——基于 UniMRCP 实现讯飞 TTS MRCP Server
  13. 虚拟机网络连接失败解决方案
  14. erp系统的开发工具
  15. linux 电驴,开源电驴 MLDonkey 3.0.7 发布
  16. 个税汇算期,公司收到好多申诉,怎么办?
  17. linux getfattr中文乱码,Linux下快速解析nf_conntrack
  18. r5 5600u和r5 5600H参数对比哪个好?
  19. AcWing 666. 三角形类型
  20. 淘宝商品详情查询V1新版接口

热门文章

  1. 使用Jackson进行json转对象,对象转json总结
  2. PHP关于VC11,VC9,VC6以及Thread Safe和Non Thread Safe版本选择的问题
  3. android 三星截长屏,三星如何截屏手机长图,三星四种截图方法介绍
  4. 网页滚动截屏怎么截长图
  5. 第一章、天天生鲜项目框架搭建
  6. Vi 编辑器常用命令
  7. 怎么做Web应用压力测试?
  8. python机器人编程教程入门_机器人编程怎么入门?
  9. 一款 redis客户端工具RedisDesktopManager的安装和使用
  10. 已解决:如何使用IDEA生成java帮助文档java doc?