实验四      GUI界面的设计和运用

20135313吴子怡

一、实验目的

结合项目,为每个密码学算法设计能够提供使用者用户体验的操作界面,实现加解密、求得消息摘要的功能。

二、代码举例(备注:其中所使用的加解密方法均为未调库自己编写的,在此处不粘贴展示,但算法代码在所导入的Algorithm包内。)

1、AES加解密算法

(1)代码

package Main;

import Algorithm.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class AESMain extends JFrame implements ActionListener {
private JLabel sourceLabel, aimLabel, keyLabel;
private JTextField sourceText, aimText, keyText;
private JButton encryptBt, decryptBt, clearBt, exitBt, selectSourceBt,
selectAimBt;
private JRadioButton methodRadioButtons = new JRadioButton();

public static void main(String[] args) {
new AESMain("AES");
}

public AESMain(String title) {
super(title);

// 初始化组件
keyLabel = new JLabel("密钥", SwingConstants.RIGHT);
sourceLabel = new JLabel("源字符串", SwingConstants.RIGHT);
aimLabel = new JLabel("目标字符串", SwingConstants.RIGHT);

keyText = new JTextField(20);
sourceText = new JTextField(20);
aimText = new JTextField(20);

encryptBt = new JButton("加密");
decryptBt = new JButton("解密");
clearBt = new JButton("清空");
exitBt = new JButton("退出");

// 划分面板
Container c = this.getContentPane();
c.setLayout(new BorderLayout());
JPanel centerPanel = new JPanel();
JPanel northPanel = new JPanel();
JPanel southPanel = new JPanel();
JPanel eastPanel = new JPanel();
JPanel westPanel = new JPanel();
c.add(eastPanel, BorderLayout.EAST);
c.add(westPanel, BorderLayout.WEST);

northPanel.setLayout(new GridLayout(1, 3));
JPanel northLeftPanel = new JPanel();
JPanel northCenterPanel = new JPanel();
JPanel northRightPanel = new JPanel();
northCenterPanel.setLayout(new FlowLayout());
northPanel.add(northLeftPanel);
northPanel.add(northCenterPanel);
northPanel.add(northRightPanel);
c.add(northPanel, BorderLayout.NORTH);

southPanel.setLayout(new GridLayout(1, 2));
JPanel southLeftPanel = new JPanel(new FlowLayout());
JPanel southRightPanel = new JPanel(new FlowLayout());
southLeftPanel.add(encryptBt);
southLeftPanel.add(decryptBt);
southRightPanel.add(clearBt);
southRightPanel.add(exitBt);
southPanel.add(southLeftPanel);
southPanel.add(southRightPanel);
c.add(southPanel, BorderLayout.SOUTH);

centerPanel.setLayout(new BorderLayout());
JPanel centerEastPanel = new JPanel(new GridLayout(3, 1));
JPanel centerWestPanel = new JPanel(new GridLayout(3, 1));
JPanel centerCenterPanel = new JPanel(new GridLayout(3, 1));
JPanel centerSouthPanel = new JPanel();
JPanel centerNorthPanel = new JPanel();
JPanel panel1 = new JPanel(new FlowLayout());
JPanel panel2 = new JPanel(new FlowLayout());
JPanel panel3 = new JPanel(new FlowLayout());
JPanel panel4 = new JPanel(new FlowLayout());
JPanel panel5 = new JPanel(new FlowLayout());
JPanel panel6 = new JPanel(new FlowLayout());
JPanel panel7 = new JPanel(new FlowLayout());
JPanel panel8 = new JPanel(new FlowLayout());
JPanel panel9 = new JPanel(new FlowLayout());
panel1.add(sourceLabel);
panel2.add(sourceText);
panel4.add(aimLabel);
panel5.add(aimText);
panel7.add(keyLabel);
panel8.add(keyText);
centerWestPanel.add(panel1);
centerWestPanel.add(panel4);
centerWestPanel.add(panel7);
centerCenterPanel.add(panel2);
centerCenterPanel.add(panel5);
centerCenterPanel.add(panel8);
centerEastPanel.add(panel3);
centerEastPanel.add(panel6);
centerEastPanel.add(panel9);
centerPanel.add(centerEastPanel, BorderLayout.EAST);
centerPanel.add(centerWestPanel, BorderLayout.WEST);
centerPanel.add(centerCenterPanel, BorderLayout.CENTER);
centerPanel.add(centerSouthPanel, BorderLayout.SOUTH);
centerPanel.add(centerNorthPanel, BorderLayout.NORTH);
c.add(centerPanel, BorderLayout.CENTER);

// 加入按钮监听
encryptBt.addActionListener(this);
decryptBt.addActionListener(this);
clearBt.addActionListener(this);
exitBt.addActionListener(this);
methodRadioButtons.addActionListener(this);

// 设置关闭按钮
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent event) {
// invoke exit in outer class
System.exit(0);
}
});
pack();
// 设置界面大小
setSize(400, 300);
setLocation(0, 0);
setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(methodRadioButtons)) {
sourceLabel.setText("源字符串");
aimLabel.setText("目标字符串");
selectSourceBt.setEnabled(false);
selectAimBt.setEnabled(false);
clear();
}
if (e.getSource().equals(selectSourceBt)) {
String sourceFile = selectFile();
sourceText.setText(sourceFile);
}
if (e.getSource().equals(selectAimBt)) {
String aimFile = selectFile();
aimText.setText(aimFile);
}
if (e.getSource().equals(encryptBt)) {
encrypt();

}
if (e.getSource().equals(decryptBt)) {
decrypt();
}
if (e.getSource().equals(exitBt)) {
System.exit(0);
}
if (e.getSource().equals(clearBt)) {
clear();
keyText.setText("");
}

}

private String selectFile() {
String rootine = "";

File aFile = null; // 接收文件
int result = 0; // 接收操作状态
JFileChooser fileChooser = new JFileChooser(); // 文件选择框
fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("打开文件");
fileChooser.setMultiSelectionEnabled(false); // 不允许一次选择多个文件
fileChooser.setCurrentDirectory(new File("..\\AES")); // 设置默认文件夹路径
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); // 只允许选择文件,不允许选择文件夹
// 设置文件过滤器
result = fileChooser.showOpenDialog(this);

if (result == JFileChooser.APPROVE_OPTION) // 选择的是确定按钮
{
aFile = fileChooser.getSelectedFile(); // 得到选择的文件
rootine = aFile.getPath();
} else if (result == JFileChooser.CANCEL_OPTION) {
}// 选择取消,文件选择框正常关闭
else {
JOptionPane.showMessageDialog(fileChooser, "文件选择框出现异常!");
}

return rootine;
}

public void encrypt() {
String source = sourceText.getText();
String key = keyText.getText();
try {

String result = new AES().textEncrypt(source, key);

aimText.setText(result);
JOptionPane.showMessageDialog(this, "加密完成! ");
return;
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "加密失败! ");
return;
}
}

public void decrypt() {
String source = sourceText.getText();
String key = keyText.getText();
try {

String result = new AES().textDecrypt(source, key);
aimText.setText(result);
JOptionPane.showMessageDialog(this, "解密完成! ");
return;
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "解密失败! ");
return;
}
}

private void clear() {
sourceText.setText("");
aimText.setText("");
}

}

(2)运行展示

2、MD5消息摘要算法

(1)代码

package Main;
import javax.swing.JOptionPane;
import Algorithm.MD5;

public class MD5Main {
public static void main(String[] args) {
String s1;
s1 = JOptionPane.showInputDialog("请输入明文,将使用MD5算法进行加密.");
String result = new MD5().calcMD5(s1);
JOptionPane.showMessageDialog(null, "消息摘要为:" + result);
}
}

(2)运行展示

三、心得体会

通过这次GUI的自学并应用,我掌握了部分的界面设计技巧和语句。并且能够应用上一些显示输入输出提示、选择等功能的方法,作出了一些简单的界面。因为是面向代码去自学,去寻找实现方式,因此所学到的东西毕竟少,也比较片面,希望在以后的学习中能够掌握更多的界面设计技巧,将界面做的更加丰富,比如带图片,或者包含更多选择功能、提示功能。

20135313_exp4的更多相关文章

随机推荐

  1. 记一次学习PHP中的错误

    今天学习PHP时,回想起一段代码 <?php> $i = true; $o = true; $p = false; if($i or $o and $p){ echo '输出为'.'tru ...

  2. 加法变乘法——第六届蓝桥杯C语言B组(省赛)第六题

    原创 加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:1+2+3+...+10*11+12+...+27*28+ ...

  3. 数据结构与算法之排序(1)冒泡排序 ——in dart

    最经典的入门排序算法,冒泡排序,dart语言实现.数组仍然采用随机生成的数组,使用dart内置的List 的generate方法,排序前后分别打印出数组,以观察效果. import 'dart:mat ...

  4. 20155207JAVA第十二周课堂练习

    20155207JAVA第十二周课堂练习 教材代码检查--P98 修改教材P98 Score2.java, 让执行结果数组填充是自己的学号 Arrays和String单元测试 在IDEA中以TDD的方 ...

  5. 20155209 实验三 敏捷开发与XP实践

    20155209 实验三 敏捷开发与XP实践 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 提交点一: 在IDEA中使用工具(Code->Reformate Code)把下面代码 ...

  6. 20155226 实验三 敏捷开发与XP实践 实验报告

    20155226 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  7. #2017-2018-1 20155327 《信息安全系统设计基础》实现mypwd

    2017-2018-1 20155327 <信息安全系统设计基础>实现mypwd Linux pwd命令用于显示工作目录. 执行pwd指令可立刻得知您目前所在的工作目录的绝对路径名称. p ...

  8. 20155328 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    一.编码标准 编程标准包含:具有说明性的名字.清晰的表达式.直截了当的控制流.可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性. 下面是没有最基本的缩进的一个程序: publi ...

  9. 实验一 Java开发环境的熟悉(Linux+Eclipse)

    实验一 Java开发环境的熟悉(Linux+Eclipse) 在Linux或Window或macOS中命令行下运行Java 在Linux 或Window或 macOS环境中 IDEA中调试设置断点 实 ...

  10. Python:静态方法、类方法、实例方法

    1. 静态方法@staticmethod (1)无需自身对象的self参数和自身类的cls参数,可直接通过 类名.方法名 进行调用 (2)Python中并不是真正意义上的静态方法,因为类定义本身就是个 ...