📄 main.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package jnotepad;import java.awt.*;import java.awt.event.*;import java.io.*;import java.text.DateFormat;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.*;import java.util.*;import javax.swing.undo.UndoManager;class JNotepad extends JFrame implements ActionListener, ItemListener, Runnable { JNotepad() { super("记事本 Time@"); this.setLayout(new BorderLayout());//null text.setLineWrap(true);//自动换行 text.setBackground(new Color(200, 255, 200)); text.getDocument().addUndoableEditListener(Un_Re); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { try { exit(); } catch (IOException ex) { Logger.getLogger(JNotepad.class.getName()).log(Level.SEVERE, null, ex); } } }); menubar = new JMenuBar(); menu = new JMenu("文件(F)"); this.setJMenuBar(menubar);//Why not this.add(menubar); menubar.add(menu); newfile = new JMenuItem("新建(N)"); newfile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK, false)); menu.add(newfile); newfile.addActionListener(this); openfile = new JMenuItem("打开(O)..."); openfile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK, false)); menu.add(openfile); openfile.addActionListener(this); savefile = new JMenuItem("保存(S)"); savefile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK, false)); menu.add(savefile); savefile.addActionListener(this); saveas = new JMenuItem("另存为(A)..."); menu.add(saveas); saveas.addActionListener(this); menu.addSeparator(); recentfiles = new JMenu("最近打开的文件(RF)"); menu.add(recentfiles); recentfiles.addActionListener(this); menu.addSeparator(); exit = new JMenuItem("退出(X)"); menu.add(exit); exit.addActionListener(this); edit = new JMenu("编辑(E)"); menubar.add(edit); undoItem = new JMenuItem("撤销(U)"); undoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.CTRL_MASK, false)); edit.add(undoItem); undoItem.addActionListener(this); redoItem = new JMenuItem("重做(R)"); redoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK, false)); edit.add(redoItem); redoItem.addActionListener(this); redoItem.setEnabled(false); edit.addSeparator(); cutItem = new JMenuItem("剪切(T)"); cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK, false)); edit.add(cutItem); cutItem.addActionListener(this); copyItem = new JMenuItem("复制(C)"); copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK, false)); edit.add(copyItem); copyItem.addActionListener(this); pasteItem = new JMenuItem("粘贴(P)"); pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK, false)); edit.add(pasteItem); pasteItem.addActionListener(this); deleteItem = new JMenuItem("删除(L)"); deleteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, KeyEvent.CTRL_MASK, true)); edit.add(deleteItem); deleteItem.addActionListener(this); edit.addSeparator(); find = new JMenuItem("查找(F)"); find.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_MASK, false)); edit.add(find); find.addActionListener(this); replace = new JMenuItem("替换(R)"); replace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_MASK, false)); edit.add(replace); replace.addActionListener(this); edit.addSeparator(); selectall = new JMenuItem("全选(A)"); selectall.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK, false)); edit.add(selectall); selectall.addActionListener(this); time_date = new JMenuItem("时间/日期(D)"); edit.add(time_date); time_date.addActionListener(this); style = new JMenu("设置(S)"); menubar.add(style); enter = new JCheckBoxMenuItem("自动换行(W)"); enter.setState(true); style.add(enter); enter.addItemListener(this); font = new JMenuItem("字体格式(F)..."); font.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_MASK, false)); style.add(font); font.addActionListener(this); style.addSeparator(); musicpanel.setLayout(new BorderLayout()); music = new JMusic(musicpanel); bkmusic = new JMenu("背景音乐(M)"); style.add(bkmusic); bkmusic.add(musicImport); musicImport.addActionListener(this); bkmusic.add(musicmode); for (int i = 0; i < 3; i++) { mode[i] = new JRadioButtonMenuItem(modeValues[i]); group.add(mode[i]); musicmode.add(mode[i]); mode[i].addActionListener(this); } mode[0].setSelected(true); bkmusic.add(musiclist); int size = music.VdirName.size(); for (int i = 0; i < size; i++) { File file = new File((String) music.VdirName.get(i)); addMusicfile(file); } bkcolor = new JMenuItem("背景颜色(B)"); bkcolor.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, KeyEvent.CTRL_MASK, false)); style.add(bkcolor); bkcolor.addActionListener(this); style.addSeparator(); drag = new JCheckBoxMenuItem("支持拖拽文件(D)"); style.add(drag); drag.setState(true); drag.addItemListener(this); view = new JMenu("查看(V)"); menubar.add(view); tool = new JCheckBoxMenuItem("工具栏"); view.add(tool); tool.setState(false); tool.addItemListener(this); about = new JMenu("关于(A)"); menubar.add(about); info = new JMenuItem("关于记事本"); info.addActionListener(this); about.add(info); popmenu.add(popundoItem); popundoItem.addActionListener(this); popmenu.add(popredoItem); popredoItem.addActionListener(this); popmenu.addSeparator(); popmenu.add(popcutItem); popcutItem.addActionListener(this); popmenu.add(popcopyItem); popcopyItem.addActionListener(this); popmenu.add(poppasteItem); poppasteItem.addActionListener(this); popmenu.add(popdeleteItem); popdeleteItem.addActionListener(this); popmenu.addSeparator(); popmenu.add(popselectall); popselectall.addActionListener(this); text.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { popmenu.show(text, e.getX(), e.getY()); } } }); this.setSize(750, 650); //设定窗体出现在屏幕的正中 //获取屏幕的大小先... Dimension scrnDim = Toolkit.getDefaultToolkit().getScreenSize(); //计算本窗体的起始位置 int x = (scrnDim.width - this.getSize().width) / 2; int y = (scrnDim.height - this.getSize().height) / 2; this.setLocation(x, y); this.add(musicpanel, BorderLayout.SOUTH); this.add(scroll, BorderLayout.CENTER); this.thread.start(); this.setVisible(true); } public int decide() throws IOException { newContent = text.getText(); if (!oldContent.equals(newContent)) { int decision = JOptionPane.showConfirmDialog(this, currentFile.getPath() + "文件的内容已经改变!\n" + "想保存文件吗?", "记事本", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); return decision; } return JOptionPane.NO_OPTION; } public void newFile() throws IOException { int decision = decide(); if (decision == JOptionPane.YES_OPTION) { if (check()) { saveFile(); } else { saveAs(); } } else if (decision == JOptionPane.CANCEL_OPTION) { return; } this.setTitle("无标题-记事本 Time@"); text.setText(""); oldContent = newContent = ""; } public void openFile() throws IOException { int decision = decide(); if (decision == JOptionPane.YES_OPTION) { if (check()) { saveFile(); } else { saveAs(); } } else if (decision == JOptionPane.CANCEL_OPTION) { return; } JFileChooser openDialog = new JFileChooser(); openDialog.setCurrentDirectory(currentFile); openDialog.setFileFilter(new javax.swing.filechooser.FileFilter() { public boolean accept(File f) { return f.getName().toLowerCase().endsWith(".txt") || f.isDirectory(); } public String getDescription() { return "文本文档(*.txt)"; } }); int Y_N = openDialog.showOpenDialog(this); if (Y_N == JFileChooser.CANCEL_OPTION) { return; } File file = openDialog.getSelectedFile(); if (file == null) { return; } text.setText(""); currentFile = file; title = currentFile.getName(); this.setTitle(title + "-记事本 Time@"); try { BufferedReader read = new BufferedReader(new FileReader(currentFile.getPath())); String oneline = null; oldContent = ""; do { oneline = read.readLine(); if (oneline != null) { text.append(oneline + "\n");//text.append(oneline + "\n"); } } while (oneline != null); text.setSelectionEnd(0); oldContent = text.getText(); text.setSelectionStart(0); text.setSelectionEnd(0); read.close(); } catch (Exception ex) { } addRecentfiles(currentFile.getPath()); } public void saveFile() throws IOException { try { BufferedWriter writer = new BufferedWriter(new FileWriter(currentFile.getPath())); String content = ""; content = text.getText(); writer.write(content); writer.flush(); writer.close(); oldContent = newContent = text.getText(); } catch (Exception e2) { } } public void saveAs() throws IOException { try { JFileChooser saveAs = new JFileChooser(); saveAs.setCurrentDirectory(currentFile); saveAs.setSelectedFile(currentFile); saveAs.setFileFilter(new javax.swing.filechooser.FileFilter() { public boolean accept(File f) { return f.getName().toLowerCase().endsWith(".txt") || f.isDirectory(); } public String getDescription() { return "文本文档(*.txt)"; } }); int Y_N = saveAs.showSaveDialog(this); if (Y_N == JFileChooser.CANCEL_OPTION) { return; } File file = new File(""); file = saveAs.getSelectedFile(); BufferedWriter writer = new BufferedWriter(new FileWriter(file.getPath())); String content = ""; do { content = text.getText(); writer.write(content); writer.close(); } while (content != null); } catch (Exception e2) { } } public void exit() throws IOException { newContent = text.getText(); if (!oldContent.equals(newContent)) { int decision = JOptionPane.showConfirmDialog(this, currentFile.getPath() + "文件的内容已经改变!\n" + "想保存文件吗?", "记事本", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (decision == JOptionPane.YES_OPTION) { saveAs(); } } thread.stop(); music.saveMusiclist(); System.exit(0); } private void cut() { clipboard.setData(text.getSelectedText()); text.replaceRange("", text.getSelectionStart(), text.getSelectionEnd());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -