实验目的
初步掌握图形界面程序设计。
实验内容
使用JLabel、JTextArea、JButton等控件实现句子的中译英demo,该demo包含四个文本框,在第一个文本框输入一句中文,在第二个和第三个文本框显示该句的英文翻译(要求使用百度翻译API、有道翻译API或其他API中的两种;自行上网查找如何调用这些API),在第四个文本框显示两个翻译的相同之处。在报告中附上程序截图、运行结果和详细的文字说明。
程序截图:
项目结构如上图,其余两个包来自百度翻译和有道翻译的官方Demo,
TranslationApi.java内容如下:
package com.homework;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.baidu.translate.demo.TransApiBaidu;
import com.youdao.aicloud.translate.TranslateYouDao;
public class TranslationApi {
private static final String BaiDu_APP_ID = "xxxxxxxxxxxxxxxx"; //百度翻译的应用ID
private static final String BaiDu_SECURITY_KEY = "xxxxxxxxxxxxxxx"; //百度翻译的应用密钥
private static final String YouDao_APPKEY="xxxxxxxxxxx"; // 有道翻译的应用ID
private static final String YouDao_APP_SERCRET = "xxxxxxxxxx"; // 有道翻译的应用密钥
//利用百度api翻译
public String trans_by_baidu(String query) throws UnsupportedEncodingException{
TransApiBaidu api = new TransApiBaidu(BaiDu_APP_ID, BaiDu_SECURITY_KEY);
String ans=api.getTransResult(query,"auto", "en");
return match_json("dst", ans);
}
//利用有道api翻译
public String trans_by_youdao(String query) throws UnsupportedEncodingException, NoSuchAlgorithmException{
TranslateYouDao api=new TranslateYouDao(YouDao_APPKEY,YouDao_APP_SERCRET);
String ans=api.getTransResult(query,"auto", "en");
return match_json("translation", ans);
}
//利用正则表达式匹配json的内容
private String match_json(String key,String JsonString){
String regex = "\""+key+"\"[\\s]*:[\\s\\[]*\"(.*?)\"";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(JsonString);
String ans_value ;
// 查找匹配
if (matcher.find()) {
// 获取匹配到的内容
ans_value = matcher.group(1);
} else {
ans_value="Nothing Matched.";
}
return ans_value;
}
}
文字说明:
此代码定义了一个TranslationApi类,用于调用百度翻译和有道翻译的api,并返回翻译结果。该类有三个函数,一个为trans_by_baidu,用于调用百度翻译的api并返回翻译结果,一个为trans_by_youdao,用于调用有道翻译的api并返回翻译结果,一个为match_json,由于翻译结果是json格式,所以利用该函数匹配对应key的value,从而得到翻译结果。
TranslationDemo.java的内容如下:
package com.homework;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.Set;
public class TranslationDemo extends JFrame {
private JTextArea chineseTextArea;
private JTextArea englishTextArea1;
private JTextArea englishTextArea2;
private JTextArea sameTextArea;
public TranslationDemo() {
// 设置窗口标题
super("Translator");
// 创建组件
chineseTextArea = new JTextArea("", 2, 25);
englishTextArea1 = new JTextArea("", 2, 25);
englishTextArea2 = new JTextArea("", 2, 25);
sameTextArea = new JTextArea("", 2, 25);
//JLabel.LEFT表示左对齐
JLabel input=new JLabel(" 请输入 :",JLabel.LEFT);
JLabel output1=new JLabel("百度翻译:",JLabel.LEFT);
JLabel output2=new JLabel("有道翻译:",JLabel.LEFT);
JLabel commoLabel=new JLabel("相同之处:",JLabel.LEFT);
JButton translateButton = new JButton("翻译");
englishTextArea1.setEditable(false);
englishTextArea2.setEditable(false);
sameTextArea.setEditable(false);
// 设置布局
setLayout(new FlowLayout());
// 添加组件
add(input);
add(chineseTextArea);
add(output1);
add(englishTextArea1);
add(output2);
add(englishTextArea2);
add(commoLabel);
add(sameTextArea);
add(translateButton);
// 设置窗口属性
setSize(350, 225);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
// 添加按钮点击事件监听器
translateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
translate();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
}
});
}
private void translate() throws UnsupportedEncodingException, NoSuchAlgorithmException {
TranslationApi translationApi = new TranslationApi();
String chineseText = chineseTextArea.getText();
String englishText1 = translationApi.trans_by_baidu(chineseText);
String englishText2 = translationApi.trans_by_youdao(chineseText);
// 设置翻译结果
englishTextArea1.setText(englishText1);
englishTextArea2.setText(englishText2);
// 查找相同之处
Set<String> same_words = find_same_words(englishText1, englishText2);
// 显示相同之处
if(same_words.isEmpty()){
sameTextArea.setText("Nothing Same");
}else{
sameTextArea.setText(String.join(", ", same_words));
}
}
private Set<String> find_same_words(String text1, String text2) {
Set<String> set1 = new HashSet<>(Set.of(text1.split("[\\s,.!?]+")));
Set<String> set2 = new HashSet<>(Set.of(text2.split("[\\s,.!?]+")));
// 取相同部分
set1.retainAll(set2);
return set1;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TranslationDemo();
}
});
}
}
运行结果截图:
文字说明:
这段代码是一个简单的翻译应用程序,通过gui提供交互。首先使用Swing库创建一个窗口,然后我们可以在其中输入中文文本并通过百度翻译和有道翻译进行翻译。翻译结果将显示在窗口中的两个文本区域,并且还会找出并显示两个翻译结果中相同的部分。我们可以通过点击"翻译"按钮触发翻译操作。整个应用程序的逻辑被封装在TranslationDemo类中,其中包括了翻译方法和查找相同的单词的方法。最后,通过调用main方法来启动应用程序的运行。