zoukankan      html  css  js  c++  java
  • Java文件选择对话框(文件选择器JFileChooser)的使用:以一个文件加密器为例

    文件加密器,操作过程肯定涉及到文件选择器的使用,所以这里以文件加密器为例。下例为我自己写的一个文件加密器,没什么特别的加密算法,只为演示文件选择器JFileChooser的使用。

    加密器界面如图:

    项目目录结构如图:

    下面贴出各个文件的源代码:

    MainForm.java

    package com.lidi;
    
    import javax.swing.*;
    import java.awt.*;
    
    public class MainForm extends JFrame {
    
        /**
         * 构造界面
         * 
         * @author 1109030125
         */
        private static final long serialVersionUID = 1L;
        /* 主窗体里面的若干元素 */
        private JFrame mainForm = new JFrame("TXT文件加密"); // 主窗体,标题为“TXT文件加密”
        private JLabel label1 = new JLabel("请选择待加密或解密的文件:");
        private JLabel label2 = new JLabel("请选择加密或解密后的文件存放位置:");
        public static JTextField sourcefile = new JTextField(); // 选择待加密或解密文件路径的文本域
        public static JTextField targetfile = new JTextField(); // 选择加密或解密后文件路径的文本域
        public static JButton buttonBrowseSource = new JButton("浏览"); // 浏览按钮
        public static JButton buttonBrowseTarget = new JButton("浏览"); // 浏览按钮
        public static JButton buttonEncrypt = new JButton("加密"); // 加密按钮
        public static JButton buttonDecrypt = new JButton("解密"); // 解密按钮
    
        public MainForm() {
            Container container = mainForm.getContentPane();
    
            /* 设置主窗体属性 */
            mainForm.setSize(400, 270);// 设置主窗体大小
            mainForm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// 设置主窗体关闭按钮样式
            mainForm.setLocationRelativeTo(null);// 设置居于屏幕中央
            mainForm.setResizable(false);// 设置窗口不可缩放
            mainForm.setLayout(null);
            mainForm.setVisible(true);// 显示窗口
    
            /* 设置各元素位置布局 */
            label1.setBounds(30, 10, 300, 30);
            sourcefile.setBounds(50, 50, 200, 30);
            buttonBrowseSource.setBounds(270, 50, 60, 30);
            label2.setBounds(30, 90, 300, 30);
            targetfile.setBounds(50, 130, 200, 30);
            buttonBrowseTarget.setBounds(270, 130, 60, 30);
            buttonEncrypt.setBounds(100, 180, 60, 30);
            buttonDecrypt.setBounds(200, 180, 60, 30);
    
            /* 为各元素绑定事件监听器 */
            buttonBrowseSource.addActionListener(new BrowseAction()); // 为源文件浏览按钮绑定监听器,点击该按钮调用文件选择窗口
            buttonBrowseTarget.addActionListener(new BrowseAction()); // 为目标位置浏览按钮绑定监听器,点击该按钮调用文件选择窗口
            buttonEncrypt.addActionListener(new EncryptAction()); // 为加密按钮绑定监听器,单击加密按钮会对源文件进行加密并输出到目标位置
            buttonDecrypt.addActionListener(new DecryptAction()); // 为解密按钮绑定监听器,单击解密按钮会对源文件进行解密并输出到目标位置
            sourcefile.getDocument().addDocumentListener(new TextFieldAction());// 为源文件文本域绑定事件,如果文件是.txt类型,则禁用解密按钮;如果是.kcd文件,则禁用加密按钮。
    
            sourcefile.setEditable(false);// 设置源文件文本域不可手动修改
            targetfile.setEditable(false);// 设置目标位置文本域不可手动修改
    
            container.add(label1);
            container.add(label2);
            container.add(sourcefile);
            container.add(targetfile);
            container.add(buttonBrowseSource);
            container.add(buttonBrowseTarget);
            container.add(buttonEncrypt);
            container.add(buttonDecrypt);
        }
    
        public static void main(String args[]) {
            new MainForm();
        }
    }

    BrowseAction.java

    package com.lidi;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFileChooser;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    public class BrowseAction implements ActionListener {
    
        @Override
        public void actionPerformed(ActionEvent e) {
    
            if (e.getSource().equals(MainForm.buttonBrowseSource)) {
                JFileChooser fcDlg = new JFileChooser();
                fcDlg.setDialogTitle("请选择待加密或解密的文件...");
                FileNameExtensionFilter filter = new FileNameExtensionFilter(
                        "文本文件(*.txt;*.kcd)", "txt", "kcd");
                fcDlg.setFileFilter(filter);
                int returnVal = fcDlg.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    String filepath = fcDlg.getSelectedFile().getPath();
                    MainForm.sourcefile.setText(filepath);
                }
            } else if (e.getSource().equals(MainForm.buttonBrowseTarget)) {
                JFileChooser fcDlg = new JFileChooser();
                fcDlg.setDialogTitle("请选择加密或解密后的文件存放目录");
                fcDlg.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int returnVal = fcDlg.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    String filepath = fcDlg.getSelectedFile().getPath();
                    MainForm.targetfile.setText(filepath);
                }
            }
        }
    
    }
    查看代码

    EncryptAction.java

    package com.lidi;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    import javax.swing.JOptionPane;
    
    public class EncryptAction implements ActionListener {
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
    
            if (MainForm.sourcefile.getText().isEmpty()) {
                JOptionPane.showMessageDialog(null, "请选择待加密文件!");
            }
    
            else if (MainForm.targetfile.getText().isEmpty()) {
                JOptionPane.showMessageDialog(null, "请选择加密后文件存放目录!");
            }
    
            else {
                String sourcepath = MainForm.sourcefile.getText();
                String targetpath = MainForm.targetfile.getText();
                File file = new File(sourcepath);
                String filename = file.getName();
                File dir = new File(targetpath);
                if (file.exists() && dir.isDirectory()) {
                    File result = new File(getFinalFile(targetpath, filename));
                    if (!result.exists()) {
                        try {
                            result.createNewFile();
                        } catch (IOException e1) {
                            JOptionPane.showMessageDialog(null,
                                    "目标文件创建失败,请检查目录是否为只读!");
                        }
                    }
    
                    try {
                        FileReader fr = new FileReader(file);
                        FileWriter fw = new FileWriter(result);
                        int ch = 0;
                        while ((ch = fr.read()) != -1) {
                            // System.out.print(Encrypt(ch));
                            fw.write(Encrypt(ch));
                        }
                        fw.close();
                        fr.close();
                        JOptionPane.showMessageDialog(null, "加密成功!");
    
                    } catch (Exception e1) {
                        JOptionPane.showMessageDialog(null, "未知错误!");
                    }
                }
    
                else if (!file.exists()) {
                    JOptionPane.showMessageDialog(null, "待加密文件不存在!");
                } else {
                    JOptionPane.showMessageDialog(null, "加密后文件存放目录不存在!");
                }
            }
        }
    
        public char Encrypt(int ch) {
            int x = ch + 1;
            return (char) (x);
        }
    
        public String getFinalFile(String targetpath, String filename) {
            int length = filename.length();
            String finalFileName = filename.substring(0, length - 4);
            String finalFile = targetpath + "\" + finalFileName + ".kcd";
            return finalFile;
        }
    
    }
    查看代码

    DecryptAction.java

    package com.lidi;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    import javax.swing.JOptionPane;
    
    public class DecryptAction implements ActionListener {
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
    
            if (MainForm.sourcefile.getText().isEmpty()) {
                JOptionPane.showMessageDialog(null, "请选择待解密文件!");
            }
    
            else if (MainForm.targetfile.getText().isEmpty()) {
                JOptionPane.showMessageDialog(null, "请选择解密后文件存放目录!");
            }
    
            else {
                String sourcepath = MainForm.sourcefile.getText();
                String targetpath = MainForm.targetfile.getText();
                File file = new File(sourcepath);
                String filename = file.getName();
                File dir = new File(targetpath);
                if (file.exists() && dir.isDirectory()) {
                    File result = new File(getFinalFile(targetpath, filename));
                    if (!result.exists()) {
                        try {
                            result.createNewFile();
                        } catch (IOException e1) {
                            JOptionPane.showMessageDialog(null,
                                    "目标文件创建失败,请检查目录是否为只读!");
                        }
                    }
    
                    try {
                        FileReader fr = new FileReader(file);
                        FileWriter fw = new FileWriter(result);
                        int ch = 0;
                        while ((ch = fr.read()) != -1) {
                            // System.out.print(Encrypt(ch));
                            fw.write(Decrypt(ch));
                        }
                        fw.close();
                        fr.close();
                        JOptionPane.showMessageDialog(null, "解密成功!");
    
                    } catch (Exception e1) {
                        JOptionPane.showMessageDialog(null, "未知错误!");
                    }
                }
    
                else if (!file.exists()) {
                    JOptionPane.showMessageDialog(null, "待解密文件不存在!");
                } else {
                    JOptionPane.showMessageDialog(null, "解密后文件存放目录不存在!");
                }
            }
        }
    
        public char Decrypt(int ch) {
            // double x = 0 - Math.pow(ch, 2);
            int x = ch - 1;
            return (char) (x);
        }
    
        public String getFinalFile(String targetpath, String filename) {
            int length = filename.length();
            String finalFileName = filename.substring(0, length - 4);
            String finalFile = targetpath + "\" + finalFileName + ".txt";
            return finalFile;
        }
    
    }
    查看代码

    TextFieldAction.java

    package com.lidi;
    
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    
    public class TextFieldAction implements DocumentListener {
    
        @Override
        public void insertUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
    
            ButtonAjust();
        }
    
        @Override
        public void removeUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
            ButtonAjust();
    
        }
    
        @Override
        public void changedUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
            ButtonAjust();
    
        }
    
        public void ButtonAjust() {
            String file = MainForm.sourcefile.getText();
            if (file.endsWith("txt")) {
                MainForm.buttonDecrypt.setEnabled(false);
                MainForm.buttonEncrypt.setEnabled(true);
            }
            if (file.endsWith("kcd")) {
                MainForm.buttonEncrypt.setEnabled(false);
                MainForm.buttonDecrypt.setEnabled(true);
            }
        }
    
    }
    查看代码
  • 相关阅读:
    mysql(一)
    spring
    数据库连接池
    spring jdbctemplate
    HDU-4219-Randomization?
    离线赛总结
    HDU-4507-吉哥系列故事-恨7不成妻
    HDU-1204-糖果大战
    [BZOJ1150][CTSC2007]数据备份
    二分图学习笔记
  • 原文地址:https://www.cnblogs.com/dige1993/p/4611401.html
Copyright © 2011-2022 走看看