Java文件选择对话框JFileChooser使用详解

 更新时间:2015年07月02日 11:08:27   投稿:hebedich  
这篇文章主要介绍了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);
    }
  }
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • 23种设计模式(9) java桥接模式

    23种设计模式(9) java桥接模式

    这篇文章主要为大家详细介绍了java设计模式之桥接模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Java中的转换流、压缩流、序列化流、打印流及应用场景

    Java中的转换流、压缩流、序列化流、打印流及应用场景

    这篇文章主要介绍了Java中的转换流、压缩流、序列化流、打印流及应用场景,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java过滤器Filter详解

    Java过滤器Filter详解

    这篇文章主要介绍了java过滤器中Filter,发送请求时,如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行。如果感兴趣可以来学习一下
    2021-08-08
  • 使用Jenkins来构建GIT+Maven项目的方法步骤

    使用Jenkins来构建GIT+Maven项目的方法步骤

    这篇文章主要介绍了使用Jenkins来构建GIT+Maven项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解Spring-Boot集成Spring session并存入redis

    详解Spring-Boot集成Spring session并存入redis

    这篇文章主要介绍了详解Spring-Boot集成Spring session并存入redis,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • java实现扑克牌牌面小程序

    java实现扑克牌牌面小程序

    这篇文章主要为大家详细介绍了java实现扑克牌牌面小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Springboot工程中使用filter过程解析

    Springboot工程中使用filter过程解析

    这篇文章主要介绍了springboot工程中使用filter过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • SpringBoot+微信小程序实现文件上传与下载功能详解

    SpringBoot+微信小程序实现文件上传与下载功能详解

    这篇文章主要为大家介绍了SpringBoot整合微信小程序实现文件上传与下载功能,文中的实现步骤讲解详细,快跟随小编一起学习一下吧
    2022-03-03
  • 关于synchronized有趣的同步问题

    关于synchronized有趣的同步问题

    今天小编就为大家分享一篇关于关于synchronized有趣的同步问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • volatile与happens-before的关系与内存一致性错误

    volatile与happens-before的关系与内存一致性错误

    本文讲了Java并发编程中volatile变量、happens-before与内存一致性错误,下面来和小编一起学习下如何解决
    2019-05-05

最新评论