深圳大学-Java程序设计实验-GUI初级应用

实验目的

初步掌握图形界面程序设计。

实验内容

使用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方法来启动应用程序的运行。

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值