用Java实现一个简单的记事本,使其可以通过给定文件的绝对路径打开文件,当该文件名是目录时,则打开一个目录并浏览该目录下的文件结构,即目录树形图。
实现原理也不难,如下:
1、判断给定的绝对路径是否为文件,若为文件则直接在编辑区中显示文件里面的内容。
2、当绝对路径是目录时,则进入该目录,遍历目录内的每一个文件,并递归地打印出该目录的树形图。
3、保存文件是=时,则打开文件对话框,获取对话框当前的目录路径,以及对话框中用户输入的“文件名”,据此新建一个File对象,将编辑区中的内容写入到新建的文件中,即实现了保存文件的功能。
下面是实现之后的界面:
代码实现如下:
- import java.awt.*;
- import java.awt.event.*;
- import java.io.*;
- import javax.swing.*;
- public class FileEditor extends JFrame {
- private JTextField selectField; //文件的绝对路径文本域
- private JTextArea editArea; //编辑区
- private JButton saveBtn; //“保存”按钮
- private JButton openFileBtn; //“浏览”按钮
- private int level = 0; //记录目录层次数
- public FileEditor() {
- this.init();
- }
- private void init() {
- this.setTitle("简单记事本");
- this.setBounds(300, 50, 600, 650);
- /*
- * 面板的北边,即路径输入域、浏览按钮
- */
- selectField = new JTextField(40);
- openFileBtn = new JButton("浏览");
- openFileBtn.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent ae) {
- FileEditor.this.level = 0;
- String path = selectField.getText();
- // 浏览目录或者文件
- openDirOrFile(path.replaceAll("/", "\\"));
- }
- });
- JPanel upPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
- upPanel.setBackground(Color.CYAN);
- upPanel.add(selectField);
- upPanel.add(openFileBtn);
- this.add(upPanel, BorderLayout.NORTH);
- /*
- * 文本编辑区
- */
- editArea = new JTextArea();
- ScrollPane scollPanel = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
- scollPanel.add(editArea);
- this.add(scollPanel, BorderLayout.CENTER);
- /*
- * 保存按钮
- */
- saveBtn = new JButton("保存");
- saveBtn.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent ae) {
- // 保存
- saveFile();
- }
- });
- JPanel southPanel = new JPanel();
- southPanel.setBackground(Color.green);
- southPanel.add(saveBtn);
- this.add(southPanel, BorderLayout.SOUTH);
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- this.setVisible(true);
- }
- /**
- * 保存文件
- */
- private void saveFile() {
- FileDialog fd = new FileDialog(this, "保存文件");
- fd.setFile("*.java");
- //设置为“保存”模式
- fd.setMode(FileDialog.SAVE);
- fd.setVisible(true);
- //获取文件名
- String fileName = fd.getFile();
- //获取对话框的当前目录
- String dir = fd.getDirectory();
- //根据目录名、文件名创建一个文件,即要保存的目标文件
- File newFile = new File(dir + File.separator + fileName);
- PrintWriter pw = null;
- try {
- pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(
- newFile)));
- String str = editArea.getText();
- pw.println(str);
- pw.flush();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- pw.close();
- }
- }
- /**
- * 打开目录或文件
- *
- * @param absolutePath : 指定目录或文件的绝对路径名
- */
- private void openDirOrFile(String absolutePath) {
- File file = new File(absolutePath);
- if (!(file.exists())) {
- editArea.setText("文件不存在!");
- } else if (file.isDirectory()) {
- editArea.setText(null);
- showDir(file);
- } else if (file.isFile()) {
- try {
- FileInputStream fis = new FileInputStream(file);
- BufferedReader br = new BufferedReader(new InputStreamReader(
- fis));
- String str = null;
- editArea.setText(null);
- while ((str = br.readLine()) != null) {
- editArea.append(str + "\r\n");
- }
- br.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 浏览目录,建立树形图
- *
- * @param directory :需要打开的目录
- */
- private void showDir(File directory) {
- File[] files = directory.listFiles();
- int len = files.length;
- for (int i = 0; i < len; i++) {
- if (files[i].isDirectory()) {
- for (int j = 0; j < this.level; j++) {
- editArea.append(" ");
- }
- editArea.append(this.level + 1 + " +" + files[i].getName() + " 文件夹\r\n");
- this.level++;
- showDir(files[i]);
- } else if(files[i].isFile()){
- for(int j = 0; j < this.level + 2; j++) {
- editArea.append(" ");
- }
- editArea.append(this.level + " ┝ ┈" + files[i].getAbsolutePath() + "\r\n");
- }
- }
- }
- /**
- * 测试
- * @param args
- */
- public static void main(String[] args) {
- new FileEditor();
- }
- }
测试:
1、打印一个目录的树形图,如下:
2、打开一个文本文件,如下:
3、保存文件,如下:
至此,一个简单记事本就完成了。但是,该记事本并没有实现菜单栏等功能。
本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/336196,如需转载请自行联系原作者