效果图:

Java实现windows记事本 用java实现记事本功能_Layout

 首先,要对编写的程序进行分析,记事本由5大模块组成,第一个就是文件类,其下包含新建,打开,保存,另存为,退出,编辑类包含全部,剪切,粘贴,复制,格式包含自动换行和字体,查看包含状态栏,帮助关于作者信息。

其次对框架结构进行整理

Java实现windows记事本 用java实现记事本功能_sed_02

可用6个类表示,即记事本的主菜单MainMenu,包括页面上的所有按钮

记事本的主程序(NotebookMain),字体部分对象(FontDialog),编码(Unicode),主面板(MainFrame)文件管理框架(FileOperator)

主程序NotebookMain

import javax.swing.*;
class Notebookmain {
    public static void main(String[] args) {
        try {
            String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
            UIManager.setLookAndFeel(lookAndFeel);//异常
        }catch (Exception e) {}
        MainFrame myFrame = new MainFrame();
        myFrame.setVisible(true);
    }
}

字体部分对象(FontDialog)

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;
public class FontDialog extends JDialog {
    private static final long serialVersionUID = 1L;
    private static Font resultFont = null;
    JList listFontName, listFontStyle, listFontSize, listFontColor;
    JTextField editFontName, editFontStyle, editFontSize, editFontColor;
    String demoString;
    JLabel labelExample;
    JButton btnOK, btnCancel;
    Color[] colorArray = {Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY,
            Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA,
            Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW};
    String[] colorNameArray = {"BLACK", "BLUE", "CYAN", "DARK_GRAY", "GRAY",
            "GREEN", "LIGHT_GRAY", "MAGENTA", "ORANGE", "PINK", "RED", "WHITE",
            "YELLOW"};

    private JFrame frame;

    public FontDialog(JFrame owner, String title, boolean modal) {
        super(owner, title, modal);
        Container container = getContentPane();
        container.setLayout(new BorderLayout());
        this.frame = owner;
        setLocationRelativeTo(owner);
        JPanel panelMain = new JPanel();
        panelMain.setLayout(new GridLayout(2, 1));
        JPanel panelFontSet, panelFontView;
        panelFontSet = new JPanel(new GridLayout(1, 4));
        panelFontView = new JPanel(new GridLayout(1, 2));
        demoString = "AaBbCcDdEe";
        labelExample = new JLabel(demoString, JLabel.CENTER);
        labelExample.setBackground(Color.WHITE);

        ListSelectionListener selectionListener = new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                if (((JList) e.getSource()).getName().equals("listFontName")) {
                    editFontName.setText((String) listFontName.getSelectedValue());
                    labelExample.setFont(new Font(editFontName.getText(), labelExample.getFont().getStyle(), labelExample.getFont().getSize()));
                }
                if (((JList) e.getSource()).getName().equals("listFontStyle")) {
                    editFontStyle.setText((String) listFontStyle.getSelectedValue());
                    labelExample.setFont(new Font(labelExample.getFont().getFontName(), listFontStyle.getSelectedIndex(), labelExample.getFont().getSize()));
                }
                if (((JList) e.getSource()).getName().equals("listFontSize")) {
                    editFontSize.setText((String) listFontSize.getSelectedValue());
                    try {
                        Integer.parseInt(editFontSize.getText());
                    } catch (Exception excepInt) {
                        editFontSize.setText(labelExample.getFont().getSize() + "");
                    }
                    labelExample.setFont(new Font(labelExample.getFont().getFontName(), labelExample.getFont().getStyle(), Integer.parseInt(editFontSize.getText())));
                }
                if (((JList) e.getSource()).getName().equals("listFontColor")) {
                    editFontColor.setText(colorNameArray[listFontColor.getSelectedIndex()]);
                    labelExample.setForeground(colorArray[listFontColor.getSelectedIndex()]);
                }
            }
        };

        KeyListener keyListener = new KeyListener() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == 10) {
                    if (((JTextField) e.getSource()).getName().equals("listFontName")) {
                        labelExample.setFont(new Font(editFontName.getText(), labelExample.getFont().getStyle(), labelExample.getFont().getSize()));
                    }
                    if (((JTextField) e.getSource()).getName().equals("listFontStyle")) {
                        editFontStyle.setText((String) listFontStyle.getSelectedValue());
                        labelExample.setFont(new Font(labelExample.getFont().getFontName(), listFontStyle.getSelectedIndex(), labelExample.getFont().getSize()));
                    }
                    if (((JTextField) e.getSource()).getName().equals("listFontSize")) {
                        try {
                            Integer.parseInt(editFontSize.getText());
                        } catch (Exception excepInt) {
                            editFontSize.setText(labelExample.getFont().getSize() + "");
                        }
                        labelExample.setFont(new Font(labelExample.getFont().getFontName(), labelExample.getFont().getStyle(), Integer.parseInt(editFontSize.getText())));
                    }
                }
            }

            public void keyReleased(KeyEvent e) {
            }

            public void keyTyped(KeyEvent e) {
            }
        };
        JPanel panelFontName = new JPanel();
        Border border = BorderFactory.createLoweredBevelBorder();
        border = BorderFactory.createTitledBorder(border, "字体");
        panelFontName.setBorder(border);
        Font[] fontArray = java.awt.GraphicsEnvironment
                .getLocalGraphicsEnvironment().getAllFonts();
        int fontArrayCount = fontArray.length;
        String[] fontNameArray = new String[fontArrayCount];
        for (int i = 0; i < fontArrayCount; i++) {
            fontNameArray[i] = fontArray[i].getName();
        }
        listFontName = new JList(fontNameArray);
        listFontName.setName("listFontName");
        listFontName.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listFontName.addListSelectionListener(selectionListener);
        listFontName.setVisibleRowCount(6);
        editFontName = new JTextField(fontNameArray[0]);
        editFontName.setName("editFontName");
        editFontName.addKeyListener(keyListener);
        JScrollPane jspFontName = new JScrollPane(listFontName);
        panelFontName.setLayout(new BoxLayout(panelFontName, BoxLayout.PAGE_AXIS));
        panelFontName.add(editFontName);
        panelFontName.add(jspFontName);
        // 样式
        JPanel panelFontstyle = new JPanel();
        border = BorderFactory.createLoweredBevelBorder();
        border = BorderFactory.createTitledBorder(border, "样式");
        panelFontstyle.setBorder(border);
        String[] fontStylesArray = {"PLAIN", "BOLD", "ITALIC", "BOLD ITALIC"};
        listFontStyle = new JList(fontStylesArray);
        listFontStyle.setName("listFontStyle");
        listFontStyle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listFontStyle.addListSelectionListener(selectionListener);
        listFontStyle.setVisibleRowCount(6);
        editFontStyle = new JTextField(fontStylesArray[0]);
        editFontStyle.setName("listFontStyle");
        editFontStyle.addKeyListener(keyListener);
        JScrollPane jspFontStyle = new JScrollPane(listFontStyle);
        panelFontstyle.setLayout(new BoxLayout(panelFontstyle, BoxLayout.PAGE_AXIS));
        panelFontstyle.add(editFontStyle);
        panelFontstyle.add(jspFontStyle);
        // 大小
        JPanel panelFontSize = new JPanel();
        border = BorderFactory.createLoweredBevelBorder();
        border = BorderFactory.createTitledBorder(border, "大小");
        panelFontSize.setBorder(border);
        String[] fontSizeArray = {"10", "14", "18", "22", "26", "30"};
        listFontSize = new JList(fontSizeArray);
        listFontSize.setName("listFontSize");
        listFontSize.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listFontSize.addListSelectionListener(selectionListener);
        listFontSize.setVisibleRowCount(6);
        editFontSize = new JTextField(fontSizeArray[0]);
        editFontSize.setName("listFontSize");
        editFontSize.addKeyListener(keyListener);
        JScrollPane jspFontSize = new JScrollPane(listFontSize);
        panelFontSize.setLayout(new BoxLayout(panelFontSize, BoxLayout.PAGE_AXIS));
        panelFontSize.add(editFontSize);
        panelFontSize.add(jspFontSize);
        // 颜色
        JPanel panelFontColor = new JPanel();
        Border borderColor = BorderFactory.createLoweredBevelBorder();
        borderColor = BorderFactory.createTitledBorder(borderColor, "颜色");
        panelFontColor.setBorder(borderColor);
        listFontColor = new JList(colorNameArray);
        listFontColor.setName("listFontColor");
        listFontColor.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listFontColor.addListSelectionListener(selectionListener);
        listFontColor.setVisibleRowCount(6);
        editFontColor = new JTextField(colorNameArray[0].toString());
        editFontColor.setName("editFontColor");
        editFontColor.addKeyListener(keyListener);
        JScrollPane jspFontColor = new JScrollPane(listFontColor);
        panelFontColor.setLayout(new BoxLayout(panelFontColor, BoxLayout.PAGE_AXIS));
        panelFontColor.add(editFontColor);
        panelFontColor.add(jspFontColor);
        panelFontSet.add(panelFontName);
        panelFontSet.add(panelFontstyle);//字体风格
        panelFontSet.add(panelFontSize);//字体的格式,粗细倾斜之类
        panelFontSet.add(panelFontColor);//字体颜色
        panelFontView.add(labelExample);
        panelMain.add(panelFontSet);
        panelMain.add(panelFontView);

        JPanel panelButton = new JPanel();
        panelButton.setLayout(new FlowLayout());
        btnOK = new JButton("确定");
        btnCancel = new JButton("取消");

        panelButton.add(btnOK);
        panelButton.add(btnCancel);

        btnOK.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                resultFont = labelExample.getFont();
                FontDialog.this.setVisible(false);
            }
        });
        btnCancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                resultFont = null;
                FontDialog.this.setVisible(false);
            }
        });
        container.add(panelMain, BorderLayout.CENTER);
        container.add(panelButton, BorderLayout.SOUTH);
        setSize(400, 300);
        this.setVisible(true);
    }
    public static Font showDialog(JFrame owner, Font font) {
        FontDialog fontDialog = new FontDialog(owner, "字体设置", true);
        fontDialog.setVisible(true);
        return resultFont;
    }
}

文件管理框架(FileOperator)

import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
public class FileOperator {
    public static void main(String[] args) {
        System.out.println(selectFile("",JFileChooser.SAVE_DIALOG));
    }

    //打开文件对话框,返回已选择的文件名
    public static String selectFile(String pathFileName,int dialogType) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch(Exception e) {
            //...
        }
        // 创建文件选择器
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//只允许选择文件
        fileChooser.setMultiSelectionEnabled(false);//不允许多选
        // 设置当前目录
        if (!pathFileName.equals(""))
            fileChooser.setCurrentDirectory(new File(pathFileName));
        fileChooser.setAcceptAllFileFilterUsed(false);//先取消文件过滤器

        final String[][] fileExtNames = {
                {".cvs", "CVS文件(*.cvs)"},
                {".txt", "文本文档(*.txt)"}
        };

        // 显示所有文件
        fileChooser.addChoosableFileFilter(new FileFilter() {
            public boolean accept(File file) {
                return true;
            }

            public String getDescription() {
                return "所有文件(*.*)";
            }
        });

        // 循环添加需要显示的文件
        for (final String[] fileExtName : fileExtNames) {
            fileChooser.setFileFilter(new FileFilter() {
                public boolean accept(File file) {
                    if (file.getName().toLowerCase().endsWith(fileExtName[0]) || file.isDirectory()) {
                        return true;
                    }
                    return false;
                }

                public String getDescription() {
                    return fileExtName[1];
                }
            });
        }

        fileChooser.setDialogType(dialogType);

        if (fileChooser.showDialog(null,null) ==JFileChooser.APPROVE_OPTION) {
            return fileChooser.getSelectedFile().getPath();
        } else {
            return "";//没有选择文件,比如取消了
        }
    }


    public static String readTxt(String path) {
        StringBuilder content = new StringBuilder("");
        try {
            String fileCharsetName = getFileCharsetName(path);
            //System.out.println("文件的编码格式为:"+fileCharsetName);

            InputStream is = new FileInputStream(path);
            //必须保证此处文件编码判断无误
            InputStreamReader isr = new InputStreamReader(is, fileCharsetName);
            BufferedReader br = new BufferedReader(isr);
            BufferedReader br2 = new BufferedReader(isr);
            String str = "";
            boolean isFirst = true;
            long start2 = System.currentTimeMillis();
            while (null != (str = br.readLine())) {
                if (!isFirst)
                    content.append(System.lineSeparator());
                else
                    isFirst = false;
                content.append(str);
            }
            long end2 = System.currentTimeMillis();
            System.out.println("charArray:"+(end2-start2));

            br.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("读取文件:" + path + "失败!");
        }
        return content.toString();
    }

    public static boolean writeTxt(String path,String fileContent,String fileCharsetName) {
        boolean saveOK = false;
        try {

            OutputStream os = new FileOutputStream(path);
            //必须保证此处文件编码判断无误
            OutputStreamWriter osr = new OutputStreamWriter(os, fileCharsetName);
            BufferedWriter wr = new BufferedWriter(osr);

            wr.write(fileContent);
            wr.close();
            saveOK = true;
        } catch (Exception e) {
            System.err.println("文件存盘失败:" + path + "失败!"+e.getMessage());
        }
        return saveOK;
    }

    public static String getFileCharsetName(String fileName) throws IOException {
        String code = "UTF-8";
        try {
            code = EncodeUtils.getEncode(fileName, true);
            System.out.println(code);
        }catch (Exception e) {
            e.printStackTrace();
        }
        return code;
    }
}

编码(Unicode)

import java.io.*;
import java.util.BitSet;
public class EncodeUtils {
    private static int BYTE_SIZE = 8;
    public static String CODE_UTF8 = "UTF-8";
    public static String CODE_UTF8_BOM = "UTF-8_BOM";
    public static String CODE_GBK = "GBK";
    public static String getEncode(String fullFileName, boolean ignoreBom) throws Exception {
        //log.debug("fullFileName ; {}", fullFileName);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fullFileName));
        return getEncode(bis, ignoreBom);
    }
    public static String getEncode(BufferedInputStream bis, boolean ignoreBom) throws Exception {
        bis.mark(0);
        String encodeType = "";
        byte[] head = new byte[3];
        bis.read(head);
        if (head[0] == -1 && head[1] == -2) {
            encodeType = "UTF-16";
        } else if (head[0] == -2 && head[1] == -1) {
            encodeType = "Unicode";
        } else if (head[0] == -17 && head[1] == -69 && head[2] == -65) { //带BOM
            if (ignoreBom) {
                encodeType = CODE_UTF8;
            } else {
                encodeType = CODE_UTF8_BOM;
            }
        } else if ("Unicode".equals(encodeType)) {
            encodeType = "UTF-16";
        } else if (isUTF8(bis)) {
            encodeType = CODE_UTF8;
        } else {
            encodeType = CODE_GBK;
        }
        return encodeType;
    }
    private static boolean isUTF8(BufferedInputStream bis) throws Exception {
        bis.reset();
        //读取第一个字节
        int code = bis.read();
        do {
            BitSet bitSet = convert2BitSet(code);
            //判断是否为单字节
            if (bitSet.get(0)) {//多字节时,再读取N个字节
                if (!checkMultiByte(bis, bitSet)) {//未检测通过,直接返回
                    return false;
                }
            } else {
                //单字节时什么都不用做,再次读取字节
            }
            code = bis.read();
        } while (code != -1);
        return true;
    }
    private static boolean checkMultiByte(BufferedInputStream bis, BitSet bitSet) throws Exception {
        int count = getCountOfSequential(bitSet);
        byte[] bytes = new byte[count - 1];
        bis.read(bytes);
        for (byte b : bytes) {
            if (!checkUtf8Byte(b)) {
                return false;
            }
        }
        return true;
    }
    private static boolean checkUtf8Byte(byte b) throws Exception {
        BitSet bitSet = convert2BitSet(b);
        return bitSet.get(0) && !bitSet.get(1);
    }
    private static int getCountOfSequential(BitSet bitSet) {
        int count = 0;
        for (int i = 0; i < BYTE_SIZE; i++) {
            if (bitSet.get(i)) {
                count++;
            } else {
                break;
            }
        }
        return count;
    }
    private static BitSet convert2BitSet(int code) {
        BitSet bitSet = new BitSet(BYTE_SIZE);
        for (int i = 0; i < BYTE_SIZE; i++) {
            int tmp3 = code >> (BYTE_SIZE - i - 1);
            int tmp2 = 0x1 & tmp3;
            if (tmp2 == 1) {
                bitSet.set(i);
            }
        }
        return bitSet;
    }
    public static void convert(String oldFullFileName, String oldCharsetName, String newFullFileName, String newCharsetName) throws Exception {
        StringBuffer content = new StringBuffer();

        BufferedReader bin = new BufferedReader(new InputStreamReader(new FileInputStream(oldFullFileName), oldCharsetName));
        String line;
        while ((line = bin.readLine()) != null) {
            content.append(line);
            content.append(System.getProperty("line.separator"));
        }
        newFullFileName = newFullFileName.replace("\\", "/");
        File dir = new File(newFullFileName.substring(0, newFullFileName.lastIndexOf("/")));
        if (!dir.exists()) {
            dir.mkdirs();
        }
        Writer out = new OutputStreamWriter(new FileOutputStream(newFullFileName), newCharsetName);
        out.write(content.toString());
    }
}

主面板(MainFrame)

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Modifier;
/**主页面**/
public class MainMenu {
    private JFrame mainFrame = null;
    private JTextArea textArea = null;
    private String currentFileCharset = "UTF-8";//当前文件字符编码
    private String currentFileName = ""; //当前文件名
    private boolean isModified = false;//文件是否已修改
    public Clipboard clipboard = new Clipboard("系统剪切板");//剪贴板
    public boolean isModified() {
        return isModified;
    }
    public void setModified(boolean modified) {
        isModified = modified;
    }
    public void setCurrentFileCharset(String currentFileCharset) {
        this.currentFileCharset = currentFileCharset;
    }
    public String getCurrentFileCharset() {
        return currentFileCharset;
    }
    public MainMenu(JFrame owner, JTextArea textArea) {
        this.mainFrame = owner;
        this.textArea = textArea;
        initMenu();
    }

    private void initMenu() {
        JMenuBar menubar = new JMenuBar();//菜单条栏、菜单条:它是菜单的容器
        JMenu menuFile = new JMenu("文件(F)");
        JMenu menuEdit = new JMenu("编辑(E)");
        JMenu menuFormat = new JMenu("格式(O)");
        JMenu menuView = new JMenu("查看(V)");
        JMenu menuHelp = new JMenu("帮助(H)");
        menuFile.setMnemonic('F'); //设置菜单的热键为字母键F,需按下Alt键和字母键F
        menuEdit.setMnemonic('E');
        menuFormat.setMnemonic('O');
        menuView.setMnemonic('V');
        menuHelp.setMnemonic('H');

        menubar.add(menuFile); //把主菜单条加入菜单栏容器中
        menubar.add(menuEdit);
        menubar.add(menuFormat);
        menubar.add(menuView);
        menubar.add(menuHelp);

 /**文件的开始菜单**/
        JMenuItem miNew = new JMenuItem("新建(N)");
        miNew.setMnemonic('O');
        miNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK)); //设置快捷键Ctrl_N
        miNew.addActionListener(this::menuFileActionPerformed);

        JMenuItem miOpen = new JMenuItem("打开(O)");
        miOpen.setMnemonic('O');
        miOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK)); //设置快捷键Ctrl_O
        miOpen.addActionListener(this::menuFileActionPerformed);

        JMenuItem miSave=new JMenuItem("保存(S)");
        miSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)); //设置快捷键Ctrl_S
        miSave.addActionListener(this::menuFileActionPerformed);

        JMenuItem miSaveAs = new JMenuItem("另存为(A)");
        miSaveAs.addActionListener(this::menuFileActionPerformed);

        JMenuItem miExit=new JMenuItem("退出(X)");
        miExit.addActionListener(this::menuFileActionPerformed);

        menuFile.add(miNew);
        menuFile.add(miOpen);
        menuFile.add(miSave);
        menuFile.add(miSaveAs);
        menuFile.addSeparator(); //分隔线
        menuFile.add(miExit);
/**文件end**/

        //---------------------------BEGIN 【编辑】菜单-----------------------//
        JMenuItem miSelectAll = new JMenuItem("全选(A)");
        miSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
        miSelectAll.addActionListener(this::menuEditActionPerformed);

        JMenuItem miCut=new JMenuItem("剪切(X)");
        miCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
        miCut.addActionListener(this::menuEditActionPerformed);

        JMenuItem miCopy = new JMenuItem("复制(C)");
        miCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
        miCopy.addActionListener(this::menuEditActionPerformed);

        JMenuItem miPaste=new JMenuItem("粘贴(V)");
        miPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
        miPaste.addActionListener(this::menuEditActionPerformed);

        menuEdit.add(miSelectAll);
        menuEdit.addSeparator();
        menuEdit.add(miCut);
        menuEdit.add(miCopy);
        menuEdit.addSeparator();
        menuEdit.add(miPaste);
        //---------------------------END 【编辑】菜单-----------------------//

        //---------------------------BEGIN 【格式】菜单-----------------------//
        JCheckBoxMenuItem miAutoLine=new JCheckBoxMenuItem("自动换行(W)");
        textArea.setLineWrap(true);        //激活自动换行功能
        textArea.setWrapStyleWord(true);   //激活断行不断字功能
        miAutoLine.setState(textArea.getLineWrap());
        miAutoLine.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK));
        miAutoLine.addActionListener(this::menuFormatActionPerformed);

        JMenuItem miFontSet = new JMenuItem("字体(F)");
        miFontSet.setMnemonic('F');
        miFontSet.addActionListener(this::menuFormatActionPerformed);

        menuFormat.add(miAutoLine);
        menuFormat.add(miFontSet);
        //---------------------------END 【格式】菜单-----------------------//

        //---------------------------BEGIN 【查看】菜单-----------------------//
        JCheckBoxMenuItem miStatusBar=new JCheckBoxMenuItem("状态栏(S)");
        miStatusBar.setMnemonic('S');
        miStatusBar.setState(true);
        miStatusBar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                ((MainFrame)mainFrame).setPanelStatusBarVisible(miStatusBar.getState());
                //自已加状态栏自已写
            }
        });

        menuView.add(miStatusBar);
        //---------------------------END 【查看】菜单-----------------------//


        //---------------------------BEGIN 【帮助】菜单-----------------------//
        JMenuItem miHelpContent = new JMenuItem("帮助信息……");
        miHelpContent.addActionListener(this::menuHelpActionPerformed);

        JMenuItem miAbout = new JMenuItem("关于……");
        miAbout.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,Modifier.FINAL));
        miAbout.addActionListener(this::menuHelpActionPerformed);

        menuHelp.add(miHelpContent);
        menuHelp.addSeparator();
        menuHelp.add(miAbout);
        //---------------------------END 【帮助】菜单-----------------------//

        mainFrame.setJMenuBar(menubar);
        mainFrame.validate();
    }

    public void menuFileActionPerformed(ActionEvent e) {
        if (((JMenuItem)e.getSource()).getText().equals("新建(N)")) {
            if (canCloseFile()) {
                initVar();
            }
        }
        else if (((JMenuItem)e.getSource()).getText().equals("打开(O)")) {
            if (canCloseFile()) {
                openFile();
            }
        }
        else if (((JMenuItem)e.getSource()).getText().equals("保存(S)")) {
            //System.out.println(currentFileCharset);
            saveFile(currentFileName);
        }
        else if (((JMenuItem)e.getSource()).getText().equals("另存为(A)")) {
            saveFile("");
        }
        else if (((JMenuItem)e.getSource()).getText().equals("退出(X)")) {
            if (canCloseFile()) {
                System.exit(0);
            }
        }
    }

    public void menuEditActionPerformed(ActionEvent e) {
        if (((JMenuItem)e.getSource()).getText().equals("全选(A)")) {
            textArea.selectAll();
        }
        else if (((JMenuItem)e.getSource()).getText().equals("复制(C)")) {
            copy();
        }
        else if (((JMenuItem)e.getSource()).getText().equals("剪切(X)")) {
            cut();
        }
        else if (((JMenuItem)e.getSource()).getText().equals("粘贴(V)")) {
            paste();
        }
    }

    public void menuFormatActionPerformed(ActionEvent e) {
        if (((JMenuItem)e.getSource()).getText().equals("自动换行(W)")) {
            boolean bl = ((JCheckBoxMenuItem)e.getSource()).getState();
            textArea.setLineWrap(bl);        //激活自动换行功能
            textArea.setWrapStyleWord(bl);   //激活断行不断字功能
        }
        else if (((JMenuItem)e.getSource()).getText().equals("字体(F)")) {
            Font myFont = FontDialog.showDialog(mainFrame,textArea.getFont());
            if (myFont != null) {
                textArea.setFont(myFont);
            }
        }
    }

    public void menuHelpActionPerformed(ActionEvent e) {
        if (((JMenuItem)e.getSource()).getText().equals("帮助信息……")) {
            String str = "某理工大学数计学院\r\n"+
                    "计算机2102周**\r\n"+
                    "半月修改";
            JOptionPane.showMessageDialog(mainFrame, str,"帮助信息", 1);
        }
        else if (((JMenuItem)e.getSource()).getText().equals("关于……")) {
            String str = "某理工大学\r\n"+
                    "数计\r\n"+
                    "计算机2102周**";
            JOptionPane.showMessageDialog(mainFrame, str,"关于本程序……", 1);
        }
    }

    public void cut() {
        copy();
        //标记开始位置
        int start = this.textArea.getSelectionStart();
        //标记结束位置
        int end = this.textArea.getSelectionEnd();
        //删除所选段
        this.textArea.replaceRange("", start, end);

    }

    public void copy() {
        //拖动选取文本
        String temp = textArea.getSelectedText();
        //把获取的内容复制到连续字符器,这个类继承了剪贴板接口
        StringSelection text = new StringSelection(temp);
        //把内容放在剪贴板
        this.clipboard.setContents(text, null);
    }

    public void paste() {
        //Transferable接口,把剪贴板的内容转换成数据
        Transferable contents = this.clipboard.getContents(this);
        //DataFalvor类判断是否能把剪贴板的内容转换成所需数据类型
        DataFlavor flavor = DataFlavor.stringFlavor;
        //如果可以转换
        if (contents.isDataFlavorSupported(flavor)) {
            String str;
            try {//开始转换
                str = (String) contents.getTransferData(flavor);
                //如果要粘贴时,鼠标已经选中了一些字符
                if (this.textArea.getSelectedText() != null) {
                    //定位被选中字符的开始位置
                    int start = this.textArea.getSelectionStart();
                    //定位被选中字符的末尾位置
                    int end = this.textArea.getSelectionEnd();
                    //把粘贴的内容替换成被选中的内容
                    this.textArea.replaceRange(str, start, end);
                } else {
                    //获取鼠标所在TextArea的位置
                    int mouse = this.textArea.getCaretPosition();
                    //在鼠标所在的位置粘贴内容
                    this.textArea.insert(str, mouse);
                }
            } catch (UnsupportedFlavorException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
        }
    }

    private void initVar() { //初始化变量和文本框
        currentFileName = "";
        mainFrame.setTitle("记事本");
        isModified = false;
        currentFileCharset = "UTF-8";
        textArea.setText("");
    }
    private boolean openFile() {
        boolean isSucessed = false;
        String fn = FileOperator.selectFile(currentFileName,JFileChooser.OPEN_DIALOG);
        if (fn.equals("")) {
            return false;
        }
        try {
            String content = FileOperator.readTxt(fn);
            textArea.setText(content);
            currentFileName = fn;
            currentFileCharset = FileOperator.getFileCharsetName(fn);
            ((MainFrame)mainFrame).setCurrentFileCharset(currentFileCharset);
            isModified = false;
            mainFrame.setTitle(new File(currentFileName).getName());

            isSucessed = true;
        } catch (Exception ex) {
        }
        return isSucessed;
    }
    private boolean canCloseFile() {
        boolean canClose = true;
        if (isModified) {
            int n = JOptionPane.showConfirmDialog(null, "文件已修改但未保存,要保存吗?", "确认对话框", JOptionPane.YES_NO_CANCEL_OPTION);
            if (n == JOptionPane.YES_OPTION) {
                canClose = saveFile(currentFileName);
            } else if (n == JOptionPane.NO_OPTION) {
            } else {
                canClose = false;
            }
        }
        return canClose;
    }
    private boolean saveFile(String fn) {
        String fileName = fn;
        if (fileName.equals("")) {
            fileName = FileOperator.selectFile(currentFileName, JFileChooser.SAVE_DIALOG);
        }
        if (fileName.equals("")) {
            return false;
        }
        boolean saveOK = false;
        try {
            String content = textArea.getText();
            saveOK = FileOperator.writeTxt(fileName, content, currentFileCharset);
            if (saveOK) { // && !currentFileName.equals(fileName)) {
                currentFileName = fileName;
                isModified = false;
                currentFileCharset = FileOperator.getFileCharsetName(currentFileName);
                mainFrame.setTitle(new File(currentFileName).getName());
            } else {
                JOptionPane.showMessageDialog(null, "文件保存失败!\r\n", "系统提示",JOptionPane.ERROR_MESSAGE);
            }
        }catch (Exception e) {
        }
        return saveOK;
    }
}

主菜单(MainMenu)

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Modifier;
/**主页面**/
public class MainMenu {
    private JFrame mainFrame = null;
    private JTextArea textArea = null;
    private String currentFileCharset = "UTF-8";//当前文件字符编码
    private String currentFileName = ""; //当前文件名
    private boolean isModified = false;//文件是否已修改
    public Clipboard clipboard = new Clipboard("系统剪切板");//剪贴板
    public boolean isModified() {
        return isModified;
    }
    public void setModified(boolean modified) {
        isModified = modified;
    }
    public void setCurrentFileCharset(String currentFileCharset) {
        this.currentFileCharset = currentFileCharset;
    }
    public String getCurrentFileCharset() {
        return currentFileCharset;
    }
    public MainMenu(JFrame owner, JTextArea textArea) {
        this.mainFrame = owner;
        this.textArea = textArea;
        initMenu();
    }

    private void initMenu() {
        JMenuBar menubar = new JMenuBar();//菜单条栏、菜单条:它是菜单的容器
        JMenu menuFile = new JMenu("文件(F)");
        JMenu menuEdit = new JMenu("编辑(E)");
        JMenu menuFormat = new JMenu("格式(O)");
        JMenu menuView = new JMenu("查看(V)");
        JMenu menuHelp = new JMenu("帮助(H)");
        menuFile.setMnemonic('F'); //设置菜单的热键为字母键F,需按下Alt键和字母键F
        menuEdit.setMnemonic('E');
        menuFormat.setMnemonic('O');
        menuView.setMnemonic('V');
        menuHelp.setMnemonic('H');

        menubar.add(menuFile); //把主菜单条加入菜单栏容器中
        menubar.add(menuEdit);
        menubar.add(menuFormat);
        menubar.add(menuView);
        menubar.add(menuHelp);

 /**文件的开始菜单**/
        JMenuItem miNew = new JMenuItem("新建(N)");
        miNew.setMnemonic('O');
        miNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK)); //设置快捷键Ctrl_N
        miNew.addActionListener(this::menuFileActionPerformed);

        JMenuItem miOpen = new JMenuItem("打开(O)");
        miOpen.setMnemonic('O');
        miOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK)); //设置快捷键Ctrl_O
        miOpen.addActionListener(this::menuFileActionPerformed);

        JMenuItem miSave=new JMenuItem("保存(S)");
        miSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)); //设置快捷键Ctrl_S
        miSave.addActionListener(this::menuFileActionPerformed);

        JMenuItem miSaveAs = new JMenuItem("另存为(A)");
        miSaveAs.addActionListener(this::menuFileActionPerformed);

        JMenuItem miExit=new JMenuItem("退出(X)");
        miExit.addActionListener(this::menuFileActionPerformed);

        menuFile.add(miNew);
        menuFile.add(miOpen);
        menuFile.add(miSave);
        menuFile.add(miSaveAs);
        menuFile.addSeparator(); //分隔线
        menuFile.add(miExit);
/**文件end**/

        //---------------------------BEGIN 【编辑】菜单-----------------------//
        JMenuItem miSelectAll = new JMenuItem("全选(A)");
        miSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
        miSelectAll.addActionListener(this::menuEditActionPerformed);

        JMenuItem miCut=new JMenuItem("剪切(X)");
        miCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
        miCut.addActionListener(this::menuEditActionPerformed);

        JMenuItem miCopy = new JMenuItem("复制(C)");
        miCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
        miCopy.addActionListener(this::menuEditActionPerformed);

        JMenuItem miPaste=new JMenuItem("粘贴(V)");
        miPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
        miPaste.addActionListener(this::menuEditActionPerformed);

        menuEdit.add(miSelectAll);
        menuEdit.addSeparator();
        menuEdit.add(miCut);
        menuEdit.add(miCopy);
        menuEdit.addSeparator();
        menuEdit.add(miPaste);
        //---------------------------END 【编辑】菜单-----------------------//

        //---------------------------BEGIN 【格式】菜单-----------------------//
        JCheckBoxMenuItem miAutoLine=new JCheckBoxMenuItem("自动换行(W)");
        textArea.setLineWrap(true);        //激活自动换行功能
        textArea.setWrapStyleWord(true);   //激活断行不断字功能
        miAutoLine.setState(textArea.getLineWrap());
        miAutoLine.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK));
        miAutoLine.addActionListener(this::menuFormatActionPerformed);

        JMenuItem miFontSet = new JMenuItem("字体(F)");
        miFontSet.setMnemonic('F');
        miFontSet.addActionListener(this::menuFormatActionPerformed);

        menuFormat.add(miAutoLine);
        menuFormat.add(miFontSet);
        //---------------------------END 【格式】菜单-----------------------//

        //---------------------------BEGIN 【查看】菜单-----------------------//
        JCheckBoxMenuItem miStatusBar=new JCheckBoxMenuItem("状态栏(S)");
        miStatusBar.setMnemonic('S');
        miStatusBar.setState(true);
        miStatusBar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                ((MainFrame)mainFrame).setPanelStatusBarVisible(miStatusBar.getState());
                //自已加状态栏自已写
            }
        });

        menuView.add(miStatusBar);
        //---------------------------END 【查看】菜单-----------------------//


        //---------------------------BEGIN 【帮助】菜单-----------------------//
        JMenuItem miHelpContent = new JMenuItem("帮助信息……");
        miHelpContent.addActionListener(this::menuHelpActionPerformed);

        JMenuItem miAbout = new JMenuItem("关于……");
        miAbout.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,Modifier.FINAL));
        miAbout.addActionListener(this::menuHelpActionPerformed);

        menuHelp.add(miHelpContent);
        menuHelp.addSeparator();
        menuHelp.add(miAbout);
        //---------------------------END 【帮助】菜单-----------------------//

        mainFrame.setJMenuBar(menubar);
        mainFrame.validate();
    }

    public void menuFileActionPerformed(ActionEvent e) {
        if (((JMenuItem)e.getSource()).getText().equals("新建(N)")) {
            if (canCloseFile()) {
                initVar();
            }
        }
        else if (((JMenuItem)e.getSource()).getText().equals("打开(O)")) {
            if (canCloseFile()) {
                openFile();
            }
        }
        else if (((JMenuItem)e.getSource()).getText().equals("保存(S)")) {
            //System.out.println(currentFileCharset);
            saveFile(currentFileName);
        }
        else if (((JMenuItem)e.getSource()).getText().equals("另存为(A)")) {
            saveFile("");
        }
        else if (((JMenuItem)e.getSource()).getText().equals("退出(X)")) {
            if (canCloseFile()) {
                System.exit(0);
            }
        }
    }

    public void menuEditActionPerformed(ActionEvent e) {
        if (((JMenuItem)e.getSource()).getText().equals("全选(A)")) {
            textArea.selectAll();
        }
        else if (((JMenuItem)e.getSource()).getText().equals("复制(C)")) {
            copy();
        }
        else if (((JMenuItem)e.getSource()).getText().equals("剪切(X)")) {
            cut();
        }
        else if (((JMenuItem)e.getSource()).getText().equals("粘贴(V)")) {
            paste();
        }
    }

    public void menuFormatActionPerformed(ActionEvent e) {
        if (((JMenuItem)e.getSource()).getText().equals("自动换行(W)")) {
            boolean bl = ((JCheckBoxMenuItem)e.getSource()).getState();
            textArea.setLineWrap(bl);        //激活自动换行功能
            textArea.setWrapStyleWord(bl);   //激活断行不断字功能
        }
        else if (((JMenuItem)e.getSource()).getText().equals("字体(F)")) {
            Font myFont = FontDialog.showDialog(mainFrame,textArea.getFont());
            if (myFont != null) {
                textArea.setFont(myFont);
            }
        }
    }

    public void menuHelpActionPerformed(ActionEvent e) {
        if (((JMenuItem)e.getSource()).getText().equals("帮助信息……")) {
            String str = "某理工大学数计学院\r\n"+
                    "计算机2102周**\r\n"+
                    "半月修改";
            JOptionPane.showMessageDialog(mainFrame, str,"帮助信息", 1);
        }
        else if (((JMenuItem)e.getSource()).getText().equals("关于……")) {
            String str = "某理工大学\r\n"+
                    "数计\r\n"+
                    "计算机2102周**";
            JOptionPane.showMessageDialog(mainFrame, str,"关于本程序……", 1);
        }
    }

    public void cut() {
        copy();
        //标记开始位置
        int start = this.textArea.getSelectionStart();
        //标记结束位置
        int end = this.textArea.getSelectionEnd();
        //删除所选段
        this.textArea.replaceRange("", start, end);

    }

    public void copy() {
        //拖动选取文本
        String temp = textArea.getSelectedText();
        //把获取的内容复制到连续字符器,这个类继承了剪贴板接口
        StringSelection text = new StringSelection(temp);
        //把内容放在剪贴板
        this.clipboard.setContents(text, null);
    }

    public void paste() {
        //Transferable接口,把剪贴板的内容转换成数据
        Transferable contents = this.clipboard.getContents(this);
        //DataFalvor类判断是否能把剪贴板的内容转换成所需数据类型
        DataFlavor flavor = DataFlavor.stringFlavor;
        //如果可以转换
        if (contents.isDataFlavorSupported(flavor)) {
            String str;
            try {//开始转换
                str = (String) contents.getTransferData(flavor);
                //如果要粘贴时,鼠标已经选中了一些字符
                if (this.textArea.getSelectedText() != null) {
                    //定位被选中字符的开始位置
                    int start = this.textArea.getSelectionStart();
                    //定位被选中字符的末尾位置
                    int end = this.textArea.getSelectionEnd();
                    //把粘贴的内容替换成被选中的内容
                    this.textArea.replaceRange(str, start, end);
                } else {
                    //获取鼠标所在TextArea的位置
                    int mouse = this.textArea.getCaretPosition();
                    //在鼠标所在的位置粘贴内容
                    this.textArea.insert(str, mouse);
                }
            } catch (UnsupportedFlavorException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
        }
    }

    private void initVar() { //初始化变量和文本框
        currentFileName = "";
        mainFrame.setTitle("记事本");
        isModified = false;
        currentFileCharset = "UTF-8";
        textArea.setText("");
    }
    private boolean openFile() {
        boolean isSucessed = false;
        String fn = FileOperator.selectFile(currentFileName,JFileChooser.OPEN_DIALOG);
        if (fn.equals("")) {
            return false;
        }
        try {
            String content = FileOperator.readTxt(fn);
            textArea.setText(content);
            currentFileName = fn;
            currentFileCharset = FileOperator.getFileCharsetName(fn);
            ((MainFrame)mainFrame).setCurrentFileCharset(currentFileCharset);
            isModified = false;
            mainFrame.setTitle(new File(currentFileName).getName());

            isSucessed = true;
        } catch (Exception ex) {
        }
        return isSucessed;
    }
    private boolean canCloseFile() {
        boolean canClose = true;
        if (isModified) {
            int n = JOptionPane.showConfirmDialog(null, "文件已修改但未保存,要保存吗?", "确认对话框", JOptionPane.YES_NO_CANCEL_OPTION);
            if (n == JOptionPane.YES_OPTION) {
                canClose = saveFile(currentFileName);
            } else if (n == JOptionPane.NO_OPTION) {
            } else {
                canClose = false;
            }
        }
        return canClose;
    }
    private boolean saveFile(String fn) {
        String fileName = fn;
        if (fileName.equals("")) {
            fileName = FileOperator.selectFile(currentFileName, JFileChooser.SAVE_DIALOG);
        }
        if (fileName.equals("")) {
            return false;
        }
        boolean saveOK = false;
        try {
            String content = textArea.getText();
            saveOK = FileOperator.writeTxt(fileName, content, currentFileCharset);
            if (saveOK) { // && !currentFileName.equals(fileName)) {
                currentFileName = fileName;
                isModified = false;
                currentFileCharset = FileOperator.getFileCharsetName(currentFileName);
                mainFrame.setTitle(new File(currentFileName).getName());
            } else {
                JOptionPane.showMessageDialog(null, "文件保存失败!\r\n", "系统提示",JOptionPane.ERROR_MESSAGE);
            }
        }catch (Exception e) {
        }
        return saveOK;
    }
}

运行结果:

 

Java实现windows记事本 用java实现记事本功能_java_03

 部分功能来源于网络搜集,仅供学习与交流

Java实现windows记事本 用java实现记事本功能_java_04