diff --git a/.classpath b/.classpath deleted file mode 100644 index ac9ce57c2f4d3a99eb1868e101f3060156474663..0000000000000000000000000000000000000000 --- a/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/.gitignore b/.gitignore index ae3c1726048cd06b9a143e0376ed46dd9b9a8d53..e0244b6702986222455bd505630bb0593dbd8a8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /bin/ +out/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..35410cacdc5e87f985c93a96520f5e11a5c822e4 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..07115cdf15dd408d3affb9240e112578e04abf68 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea25cb6475b9409a6cd5868ef50ea0cdc7ce9a84 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index b7e8a74e9dd98bfb5b42b70cd6033510d6823948..0000000000000000000000000000000000000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - java2022spring - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index dbc27c5dc60ef7094a88953087ea0294b6c44a38..0000000000000000000000000000000000000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,14 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=17 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 diff --git a/java2022spring.iml b/java2022spring.iml new file mode 100644 index 0000000000000000000000000000000000000000..c90834f2d607afe55e6104d8aa2cdfffb713f688 --- /dev/null +++ b/java2022spring.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/img/SCAU.jpg b/src/img/SCAU.jpg new file mode 100644 index 0000000000000000000000000000000000000000..748cc786d7f7f5ae5eb0d3743a5bd71ecb034565 Binary files /dev/null and b/src/img/SCAU.jpg differ diff --git a/src/img/logo.png b/src/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b08ee8cce55b8f0e9e16c3605f1c4f48c30f0eb7 Binary files /dev/null and b/src/img/logo.png differ diff --git a/src/java2022spring/NotepadFrame.java b/src/java2022spring/NotepadFrame.java new file mode 100644 index 0000000000000000000000000000000000000000..5597561d24506161324805fb0f17662851cfb01e --- /dev/null +++ b/src/java2022spring/NotepadFrame.java @@ -0,0 +1,591 @@ +package java2022spring; + +import javax.swing.*; +import javax.swing.undo.CannotRedoException; +import javax.swing.undo.CannotUndoException; +import javax.swing.undo.UndoManager; +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.Date; + +import static java.awt.event.InputEvent.SHIFT_DOWN_MASK; + +public class NotepadFrame extends JFrame { + int lineNum = 1; //定义变量lineNum储存行数 + int columnNum = 1; //定义变量columnNum储存列数 + int length = 0; //定义变量length储存字数 + JToolBar toolBar = new JToolBar(); + JFileChooser fileChooser = new JFileChooser(); + UndoManager um = new UndoManager(); + File currentFile; //currentFile用于储存当前文件 + String oldValue; //oldValue用于储存文本操作前的内容 + String currentValue; //currentValue用于储存当前的内容 + boolean isTextChange; //isTextChange用于判断文本内容是否发生改变 + boolean isNewFile = true; //isNewFile用于判断文件是否已经创建 + //声明文本区、滚动条、菜单栏 + JTextArea textPane; + JScrollPane scrollPane; + JMenuBar menuBar; + //声明一级菜单“文件”,并声明其二级菜单 + JMenu fileMenu; + JMenuItem newFile,newFrame,openFile,saveFile,saveAs,exit; + //声明一级菜单“编辑”,并声明其二级菜单 + JMenu editMenu; + JMenuItem undo,redo,cut,copy,paste,del,selectAll; + //声明一级菜单“格式”,并声明其二级菜单 + JMenu formatMenu; + JMenuItem font,insertTime; + JCheckBoxMenuItem autoWrap; + //声明一级菜单“查看”,并声明其二级菜单,和一个三级菜单 + JMenu viewMenu; + JMenu zoom; + JMenuItem enlarge,reduce,reset; + JCheckBoxMenuItem statusBar,protectEye; + //声明一级菜单“帮助”,并声明其二级菜单 + JMenu helpMenu; + JMenuItem readHelp,aboutNotepad; + + //构造方法 + public NotepadFrame() { + init(); //初始化窗体 + toolBarInit(); //初始化状态栏 + setContextMenu(); //初始化右键菜单栏 + setShortcut(); //初始化快捷键 + setIconImage(new ImageIcon("src/img/logo.png").getImage()); + setTitle("无标题 - 记事本"); + setSize(800, 800); + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + setVisible(true); + setLocationRelativeTo(null); + //监听窗口关闭操作,判断是否保存并提示用户 + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + currentValue = textPane.getText(); //获取当前文本 + isTextChange = !currentValue.equals(oldValue); //若文本改变值为true,否则为false + if (isTextChange) { + int saveChoose = JOptionPane.showConfirmDialog(null,"您的文件尚未保存,请问是否保存?","提示",JOptionPane.YES_NO_CANCEL_OPTION); + if (saveChoose==JOptionPane.YES_OPTION) { + if (isNewFile) { + saveAs(); //调用“另存为”方法 + } + else{ + saveFile(); //调用“保存”方法 + } + } + else if (saveChoose==JOptionPane.NO_OPTION) { + dispose(); + } + } + else + dispose(); + } + }); + } + + public void init() { + menuBar = new JMenuBar(); //创建菜单栏 + //创建第一个一级菜单“文件”和其所有二级菜单 + fileMenu = new JMenu("文件(F)"); + newFile = new JMenuItem("新建"); + newFrame = new JMenuItem("新建窗口"); + openFile = new JMenuItem("打开"); + saveFile = new JMenuItem("保存"); + saveAs = new JMenuItem("另存为"); + exit = new JMenuItem("退出"); + //将二级菜单加入到第一个一级菜单中 + fileMenu.add(newFile); + fileMenu.add(newFrame); + fileMenu.add(openFile); + fileMenu.add(saveFile); + fileMenu.add(saveAs); + fileMenu.addSeparator(); + fileMenu.add(exit); + menuBar.add(fileMenu); + //创建第二个一级菜单“编辑”和其所有二级菜单 + editMenu = new JMenu("编辑(E)"); + undo = new JMenuItem("撤销"); + redo = new JMenuItem("恢复"); + cut = new JMenuItem("剪切"); + copy = new JMenuItem("复制"); + paste = new JMenuItem("粘贴"); + del = new JMenuItem("删除"); + selectAll = new JMenuItem("全选"); + //将二级菜单加入到第二个一级菜单中 + editMenu.add(undo); + editMenu.add(redo); + editMenu.addSeparator(); + editMenu.add(cut); + editMenu.add(copy); + editMenu.add(paste); + editMenu.add(del); + editMenu.addSeparator(); + editMenu.add(selectAll); + menuBar.add(editMenu); + //创建第三个一级菜单“格式”和其所有二级菜单 + formatMenu = new JMenu("格式(O)"); + font = new JMenuItem("字体..."); + insertTime = new JMenuItem("日期和时间"); + autoWrap = new JCheckBoxMenuItem("自动换行"); + //将二级菜单加入到第三个一级菜单中 + formatMenu.add(font); + formatMenu.add(autoWrap); + formatMenu.add(insertTime); + menuBar.add(formatMenu); + //创建第四个一级菜单“查看”和其所有二级菜单 + viewMenu = new JMenu("查看(V)"); + statusBar = new JCheckBoxMenuItem("状态栏"); + protectEye = new JCheckBoxMenuItem("护眼模式"); + zoom = new JMenu("缩放"); + enlarge = new JMenuItem("放大"); + reduce = new JMenuItem("缩小"); + reset = new JMenuItem("还原默认缩放"); + //将二级菜单加入到第四个一级菜单中 + zoom.add(enlarge); + zoom.add(reduce); + zoom.addSeparator(); + zoom.add(reset); + viewMenu.add(zoom); + viewMenu.add(statusBar); + viewMenu.add(protectEye); + menuBar.add(viewMenu); + //创建第五个一级菜单“查看”和其所有二级菜单 + helpMenu = new JMenu("帮助(H)"); + readHelp = new JMenuItem("查看帮助"); + aboutNotepad = new JMenuItem("关于记事本"); + //将二级菜单加入到第五个一级菜单中 + helpMenu.add(readHelp); + helpMenu.addSeparator(); + helpMenu.add(aboutNotepad); + menuBar.add(helpMenu); + //显示菜单栏 + setJMenuBar(menuBar); + + //设置文本框和默认字体及大小 + textPane = new JTextArea(); + textPane.setFont(new Font("宋体",Font.PLAIN,16)); + textPane.getDocument().addUndoableEditListener(um); //获取可撤销的操作 + add(textPane); + //储存文本框内现有的文本 + oldValue = textPane.getText(); + //添加滚动条 + scrollPane = new JScrollPane(textPane); + add(scrollPane); + + //为“文件”菜单的所有选项注册监听器 + newFile.addActionListener(e -> newFile()); + newFrame.addActionListener(e -> newFrame()); + openFile.addActionListener(e -> openFile()); + saveFile.addActionListener(e -> saveFile()); + saveAs.addActionListener (e -> saveAs()); + exit.addActionListener(e -> exit()); + //为”编辑“菜单的所有选项注册监听器 + undo.addActionListener(e -> undo()); + redo.addActionListener(e -> redo()); + cut.addActionListener(e -> cut()); + copy.addActionListener(e -> copy()); + paste.addActionListener(e -> paste()); + del.addActionListener(e -> del()); + selectAll.addActionListener(e -> selectAll()); + //为“格式”菜单的所有选项注册监听器 + insertTime.addActionListener(e -> insertTime()); + font.addActionListener(e -> font()); + autoWrap.addActionListener(e -> autoWarp()); + //为“查看”菜单的所有选项注册监听器 + protectEye.addActionListener(e -> protectEye()); + statusBar.addActionListener(e -> toolBar.setVisible(statusBar.getState())); + enlarge.addActionListener(e -> textPane.setFont(new Font(textPane.getFont().getName(),textPane.getFont().getStyle(),textPane.getFont().getSize()+2))); //字体大小+2 + reduce.addActionListener(e -> textPane.setFont(new Font(textPane.getFont().getName(),textPane.getFont().getStyle(),textPane.getFont().getSize()-2))); //字体大小-2 + reset.addActionListener(e -> textPane.setFont(new Font(textPane.getFont().getName(),textPane.getFont().getStyle(),16))); + //为”帮助“菜单的所有选项注册监听器 + readHelp.addActionListener(e -> readHelp()); + aboutNotepad.addActionListener(e -> aboutNotepad()); + } + + //“新建”方法 + void newFile() { + currentValue = textPane.getText(); //获取当前文本 + isTextChange = !currentValue.equals(oldValue); //若文本改变值为true,否则为false + if (isTextChange) { + int saveChoose = JOptionPane.showConfirmDialog(null,"您的文件尚未保存,请问是否保存?","提示",JOptionPane.YES_NO_CANCEL_OPTION); + if (saveChoose==JOptionPane.YES_OPTION) { + if (isNewFile) { + saveAs(); + } + else + saveFile(); + } + else if (saveChoose==JOptionPane.NO_OPTION) { + textPane.setText(null); + setTitle("无标题 - 记事本"); + isNewFile = true; + oldValue = textPane.getText(); + } + } + else { + textPane.setText(null); + setTitle("无标题 - 记事本"); + isNewFile = true; + oldValue = textPane.getText(); + } + isNewFile = true; + } + + //“新建窗口”方法 + void newFrame() { + JFrame frame = new NotepadFrame(); + frame.setBounds(new Rectangle((int)getBounds().getX()+20,(int)getBounds().getY()+20,(int)getBounds().getWidth(),(int)getBounds().getHeight())); + frame.setVisible(true); + frame.setTitle("无标题 - 记事本"); + frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + //“打开文件”方法 + void openFile() { + currentValue = textPane.getText(); //获取当前文本 + isTextChange = !currentValue.equals(oldValue); //若文本改变值为true,否则为false + if (isTextChange) { + int saveChoose = JOptionPane.showConfirmDialog(null, "您的文件尚未保存,请问是否保存?", "提示", JOptionPane.YES_NO_CANCEL_OPTION); + if (saveChoose == JOptionPane.YES_OPTION) { + if (isNewFile) { + saveAs(); + } else { + saveFile(); + open(); + } + } + else if (saveChoose == JOptionPane.NO_OPTION) { + open(); + } + } + else + open(); + } + + //“保存文件”方法 + void saveFile() { + if (isNewFile) { + saveAs(); + } + else { + try{ + FileWriter fw = new FileWriter(currentFile); + BufferedWriter bw = new BufferedWriter(fw); + bw.write(textPane.getText(),0,textPane.getText().length()); + bw.flush(); + fw.close(); + }catch (IOException ex){ + ex.printStackTrace(); + } + } + } + + //“另存为”方法 + void saveAs() { + fileChooser.setDialogTitle("另存为"); + save(); + } + + //“退出”方法 + void exit() { + currentValue = textPane.getText(); //获取当前文本 + isTextChange = !currentValue.equals(oldValue); //若文本改变值为true,否则为false + if (isTextChange) { + int saveChoose = JOptionPane.showConfirmDialog(null,"您的文件尚未保存,请问是否保存?","提示",JOptionPane.YES_NO_CANCEL_OPTION); + if (saveChoose==JOptionPane.YES_OPTION) { + if (isNewFile) { + saveAs(); + } + else{ + saveFile(); + } + } + else if (saveChoose==JOptionPane.NO_OPTION) { + dispose(); + } + } + else + dispose(); + } + + //“撤销”方法 + void undo() { + if(um.canUndo()) { + try{ + um.undo(); + }catch (CannotUndoException ex){ + System.out.println("Unable to undo:" + ex); + } + } + } + + //“恢复”方法 + void redo() { + if(um.canRedo()) { + try { + um.redo(); + } catch (CannotRedoException ex){ + System.out.println("Unable to redo:" + ex); + } + } + } + + //“剪切”方法 + void cut() { + textPane.cut(); + } + + //“复制”方法 + void copy() { + textPane.copy(); + } + + //“粘贴”方法 + void paste() { + textPane.paste(); + } + + //“删除”方法 + void del() { + textPane.replaceSelection(null); + } + + //“全选”方法 + void selectAll() { + textPane.selectAll(); + } + + //“自动换行”方法 + void autoWarp() { + if (textPane.getLineWrap()) { + textPane.setLineWrap(false); + } else if (!textPane.getLineWrap()) { + textPane.setLineWrap(true); + } + } + + //“查看帮助”方法 + void readHelp() { + JDialog help = new readHelpDialog(); + help.setTitle("帮助"); + help.setContentPane(new readHelpDialog().panel1); + help.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + help.setModal(true); + help.setSize(300,500); + help.setLocationRelativeTo(null); + help.setResizable(false); + help.setVisible(true); + } + + //“关于记事本”方法 + void aboutNotepad() { + JDialog about = new aboutNotepadDialog(); + about.setTitle("关于记事本"); + about.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + about.setModal(true); + about.setSize(400, 400); + about.setLocationRelativeTo(null); + about.setResizable(false); + about.setVisible(true); + } + + //”打开“方法 + void open() { + String s; + fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("打开文件"); + int result = fileChooser.showOpenDialog(null); + if (result == JFileChooser.CANCEL_OPTION) { + return; + } + File f = fileChooser.getSelectedFile(); + textPane.setText(null); + try { + FileReader fileReader = new FileReader(f); + BufferedReader bufferedReader = new BufferedReader(fileReader); + while ((s = bufferedReader.readLine()) != null) { + textPane.append(s); + } + setTitle(f.getName()+" - 记事本"); + bufferedReader.close(); + fileReader.close(); + currentFile = f; + oldValue = textPane.getText(); + isNewFile = false; + } + catch (IOException ex){ + ex.printStackTrace(); + } + } + + //"保存"方法 + void save() { + int result = fileChooser.showSaveDialog(this); + fileChooser.setDialogTitle("保存"); + if (result == JFileChooser.CANCEL_OPTION) { + return; + } + File saveFileName = fileChooser.getSelectedFile(); + try{ + FileWriter fw = new FileWriter(saveFileName); + BufferedWriter bw = new BufferedWriter(fw); + bw.write(textPane.getText(),0,textPane.getText().length()); + bw.flush(); + bw.close(); + this.setTitle(saveFileName.getName() + " - 记事本"); + oldValue = textPane.getText(); + currentFile = saveFileName; + isNewFile = false; + }catch (IOException ex) { + ex.printStackTrace(); + } + } + + //初始化状态栏方法 + void toolBarInit() { + toolBar = new JToolBar(); + toolBar.setSize(textPane.getSize().width,20); + toolBar.setVisible(true); + statusBar.setState(true); + JLabel tool_label1 = new JLabel(" 第 " + lineNum + " 行 "); + JLabel tool_label2 = new JLabel(" 第 " + columnNum + " 列 "); + JLabel tool_label3 = new JLabel(" 共" + length + "字 "); + toolBar.add(tool_label1); + toolBar.addSeparator(); + toolBar.add(tool_label2); + toolBar.addSeparator(); + toolBar.add(tool_label3); + add(toolBar,BorderLayout.SOUTH); + toolBar.setFloatable(false); + textPane.addCaretListener(e -> { + JTextArea editArea = (JTextArea)e.getSource(); + try { + int caretPosition = editArea.getCaretPosition(); + lineNum = editArea.getLineOfOffset(caretPosition); + columnNum = caretPosition - textPane.getLineStartOffset(lineNum); + lineNum += 1; + tool_label1.setText(" 第 " + lineNum + " 行 "); + tool_label2.setText(" 第 " + columnNum + " 列 "); + length = textPane.getText().length(); + tool_label3.setText(" 共 " + length + " 字 "); + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + } + //初始化快捷键方法 + void setShortcut() { + //为一级菜单添加热键 + fileMenu.setMnemonic('F'); + editMenu.setMnemonic('E'); + formatMenu.setMnemonic('O'); + viewMenu.setMnemonic('V'); + helpMenu.setMnemonic('H'); + //为一些菜单选项添加快捷键 + newFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK)); + newFrame.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_DOWN_MASK+SHIFT_DOWN_MASK)); + openFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_DOWN_MASK)); + saveFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_DOWN_MASK)); + saveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12,0)); + exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_DOWN_MASK)); + undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_DOWN_MASK)); + redo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,InputEvent.CTRL_DOWN_MASK)); + cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_DOWN_MASK)); + copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_DOWN_MASK)); + paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_DOWN_MASK)); + del.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,InputEvent.CTRL_DOWN_MASK)); + selectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_DOWN_MASK)); + insertTime.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0)); + font.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,InputEvent.CTRL_DOWN_MASK)); + autoWrap.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,InputEvent.CTRL_DOWN_MASK)); + statusBar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,InputEvent.CTRL_DOWN_MASK)); + enlarge.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ADD,InputEvent.CTRL_DOWN_MASK)); + reduce.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT,InputEvent.CTRL_DOWN_MASK)); + reset.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_0,InputEvent.CTRL_DOWN_MASK)); + protectEye.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_DOWN_MASK)); + readHelp.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_DOWN_MASK)); + aboutNotepad.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_DOWN_MASK)); + } + + //初始化右键菜单方法 + void setContextMenu() { + //实例化右键菜单及其菜单选项 + JPopupMenu popupMenu = new JPopupMenu(); + JMenuItem pm_Undo = new JMenuItem("撤销"); + JMenuItem pm_Redo = new JMenuItem("恢复"); + JMenuItem pm_Cut = new JMenuItem("剪切"); + JMenuItem pm_Copy = new JMenuItem("复制"); + JMenuItem pm_Paste = new JMenuItem("粘贴"); + JMenuItem pm_Del = new JMenuItem("删除"); + JMenuItem pm_All = new JMenuItem("全选"); + //为右键鼠标动作注册监听器MouseListener + textPane.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.isPopupTrigger()) { + popupMenu.show(e.getComponent(), e.getX(), e.getY()); //获取鼠标的位置,并在位置上显示菜单 + } + textPane.requestFocus(); + } + public void mouseReleased(MouseEvent e) { + if (e.isPopupTrigger()) { + popupMenu.show(e.getComponent(), e.getX(), e.getY()); + } + textPane.requestFocus(); + } + }); + //把选项添加进右键菜单中 + popupMenu.add(pm_Undo); + popupMenu.add(pm_Undo); + popupMenu.add(pm_Redo); + popupMenu.addSeparator(); + popupMenu.add(pm_Cut); + popupMenu.add(pm_Copy); + popupMenu.add(pm_Paste); + popupMenu.add(pm_Del); + popupMenu.addSeparator(); + popupMenu.add(pm_All); + //为右键菜单各个选项注册监听器 + pm_Undo.addActionListener(e -> undo()); + pm_Redo.addActionListener(e -> redo()); + pm_Cut.addActionListener(e -> cut()); + pm_Copy.addActionListener(e -> copy()); + pm_Paste.addActionListener(e -> paste()); + pm_Del.addActionListener(e -> del()); + pm_All.addActionListener(e -> selectAll()); + } + + //"字体"方法 + void font() { + setFont sf = new setFont(); + if (sf.getState()==1){ //值为1代表用户确认修改字体 + textPane.setFont(sf.getFont()); + if (sf.getColor()==null){ + return; + } + else + textPane.setForeground(sf.getColor()); + textPane.setVisible(true); + textPane.repaint(); + } + if (sf.getState()==0){ //值为0代表用户取消 + textPane.repaint(); + } + } + + void protectEye(){ + if (protectEye.getState()) + textPane.setBackground(new Color(207,232,204)); + else if (!protectEye.getState()){ + textPane.setBackground(new Color(255, 255, 255)); + } + } + + void insertTime(){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期和时间的格式 + String date = sdf.format(new Date()); //获取时间和日期 + textPane.append(date); + } +} \ No newline at end of file diff --git a/src/java2022spring/Test.java b/src/java2022spring/Test.java deleted file mode 100644 index 24deb29bfc0e5f50fdedcd21b504e77b529d48b6..0000000000000000000000000000000000000000 --- a/src/java2022spring/Test.java +++ /dev/null @@ -1,7 +0,0 @@ -package java2022spring; - -public class Test { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} diff --git a/src/java2022spring/aboutNotepadDialog.java b/src/java2022spring/aboutNotepadDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..88373abcfcb3e346e7f39da09041d975fd0b8bfd --- /dev/null +++ b/src/java2022spring/aboutNotepadDialog.java @@ -0,0 +1,146 @@ +package java2022spring; + +import javax.swing.*; +import java.awt.*; +import java.util.Objects; + +public class aboutNotepadDialog extends JDialog { + JPanel jp; + JLabel img; + + public aboutNotepadDialog(){ + jp = new JPanel(); + jp.setLayout(new BorderLayout(0, 0)); + img = new JLabel(); + img.setHorizontalAlignment(0); + img.setHorizontalTextPosition(2); + img.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/img/SCAU.jpg")))); + img.setText(""); + jp.add(img, BorderLayout.NORTH); + + final JLabel label1 = new JLabel(); + label1.setForeground(new Color(-9539986)); + label1.setHorizontalAlignment(0); + label1.setText("Copyright © 2022 Xiangcheng Zeng. All Rights Reserved."); + jp.add(label1, BorderLayout.SOUTH); + + final JPanel panel1 = new JPanel(); + panel1.setLayout(new GridBagLayout()); + jp.add(panel1, BorderLayout.CENTER); + final JPanel spacer1 = new JPanel(); + add(jp); + + GridBagConstraints gbc; + gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 6; + gbc.fill = GridBagConstraints.VERTICAL; + panel1.add(spacer1, gbc); + + final JLabel label2 = new JLabel(); + label2.setText("作者信息"); + label2.setFont(new Font("宋体",Font.BOLD,18)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 6; + panel1.add(label2, gbc); + + final JLabel label3 = new JLabel(); + label3.setText("姓名:曾祥程"); + label3.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 7; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label3, gbc); + + final JLabel label4 = new JLabel(); + label4.setText("班级:21级信息管理与信息系统2班"); + label4.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 8; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label4, gbc); + + final JLabel label5 = new JLabel(); + label5.setText("学号:202125710224"); + label5.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 9; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label5, gbc); + + final JLabel label6 = new JLabel(); + label6.setText("邮箱:202125710224@stu.scau.edu.cn"); + label6.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 10; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label6, gbc); + + final JLabel label7 = new JLabel(); + label7.setText("电话:19303028985"); + label7.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 11; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label7, gbc); + + final JLabel label8 = new JLabel(); + label8.setText("项目信息"); + label8.setFont(new Font("宋体",Font.BOLD,18)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 0; + panel1.add(label8, gbc); + + final JLabel label9 = new JLabel(); + label9.setText("项目:Java面向对象程序设计实验—设计性实验"); + label9.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 1; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label9, gbc); + + final JLabel label10 = new JLabel(); + label10.setText("任课教师:吴春胤 副教授"); + label10.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 4; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label10, gbc); + + final JLabel label11 = new JLabel(); + label11.setText("名称:记事本"); + label11.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 2; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label11, gbc); + + final JLabel label12 = new JLabel(); + label12.setText(" "); + label12.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 5; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label12, gbc); + + final JLabel label13 = new JLabel(); + label13.setText("版本号:1.0.0"); + label13.setFont(new Font("宋体",Font.PLAIN,14)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 3; + gbc.anchor = GridBagConstraints.WEST; + panel1.add(label13, gbc); + } +} diff --git a/src/java2022spring/readHelpDialog.java b/src/java2022spring/readHelpDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..e2722096e51ca681f34b2d78c5f835dd8e00d67f --- /dev/null +++ b/src/java2022spring/readHelpDialog.java @@ -0,0 +1,173 @@ +package java2022spring; + +import javax.swing.*; +import java.awt.*; + +public class readHelpDialog extends JDialog { + JPanel panel1; + + public readHelpDialog() { + panel1 = new JPanel(); + panel1.setLayout(new BorderLayout(0, 0)); + final JLabel label1 = new JLabel(); + label1.setHorizontalAlignment(0); + label1.setText("常用快捷键"); + label1.setFont(new Font("宋体", Font.BOLD, 22)); + panel1.add(label1, BorderLayout.NORTH); + + final JPanel panel2 = new JPanel(); + panel2.setLayout(new GridBagLayout()); + panel1.add(panel2, BorderLayout.CENTER); + final JPanel spacer1 = new JPanel(); + GridBagConstraints gbc; + gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 2; + gbc.fill = GridBagConstraints.VERTICAL; + panel2.add(spacer1, gbc); + + final JLabel label2 = new JLabel(); + label2.setText("新建:Ctrl+N"); + label2.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label2, gbc); + + final JLabel label3 = new JLabel(); + label3.setText("打开:Ctrl+O"); + label3.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 2; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label3, gbc); + + final JLabel label4 = new JLabel(); + label4.setText("保存:Ctrl+S"); + label4.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 3; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label4, gbc); + + final JLabel label5 = new JLabel(); + label5.setText("新建窗口:Ctrl+Shift+N"); + label5.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 1; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label5, gbc); + + final JLabel label6 = new JLabel(); + label6.setText("另存为:F12"); + label6.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 4; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label6, gbc); + + final JLabel label7 = new JLabel(); + label7.setText("撤销:Ctrl+Z"); + label7.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 5; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label7, gbc); + + final JLabel label8 = new JLabel(); + label8.setText("恢复:Ctrl+R"); + label8.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 6; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label8, gbc); + + final JLabel label9 = new JLabel(); + label9.setText("剪切:Ctrl+X"); + label9.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 7; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label9, gbc); + + final JLabel label10 = new JLabel(); + label10.setText("复制:Ctrl+C"); + label10.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 8; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label10, gbc); + + final JLabel label11 = new JLabel(); + label11.setText("粘贴:Ctrl+V"); + label11.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 9; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label11, gbc); + + final JLabel label12 = new JLabel(); + label12.setText("删除:Ctrl+D"); + label12.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 10; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label12, gbc); + + final JLabel label13 = new JLabel(); + label13.setText("全选:Ctrl+A"); + label13.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 11; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label13, gbc); + + final JLabel label14 = new JLabel(); + label14.setText("自动换行:Ctrl+W"); + label14.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 12; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label14, gbc); + + final JLabel label15 = new JLabel(); + label15.setText("状态栏:Ctrl+M"); + label15.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 13; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label15, gbc); + + final JLabel label16 = new JLabel(); + label16.setText("查看帮助:Ctrl+H"); + label16.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 14; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label16, gbc); + + final JLabel label17 = new JLabel(); + label17.setText("关于记事本:Ctrl+T"); + label17.setFont(new Font("宋体", Font.PLAIN, 22)); + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 15; + gbc.anchor = GridBagConstraints.WEST; + panel2.add(label17, gbc); + } +} diff --git a/src/java2022spring/runNotepad.java b/src/java2022spring/runNotepad.java new file mode 100644 index 0000000000000000000000000000000000000000..4a76247d5e3fadb4b64cd7dbb3a75abf8b7a17f4 --- /dev/null +++ b/src/java2022spring/runNotepad.java @@ -0,0 +1,19 @@ +package java2022spring; + +import javax.swing.*; +import java.awt.*; + +public class runNotepad { + public static void main(String[] args) { + //获取当前系统UI运用于Java程序(有参考相关资料) + EventQueue.invokeLater(() -> { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | + UnsupportedLookAndFeelException e) { + throw new RuntimeException(e); + } + new NotepadFrame(); + }); + } +} diff --git a/src/java2022spring/setFont.java b/src/java2022spring/setFont.java new file mode 100644 index 0000000000000000000000000000000000000000..ea99abca456dccdae9e44188eb95509a531751c2 --- /dev/null +++ b/src/java2022spring/setFont.java @@ -0,0 +1,186 @@ +package java2022spring; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Objects; + +public class setFont extends JDialog implements ActionListener { + String s = "AaBbCc我爱学习"; + String[] faceString = { "正常", "粗体", "斜体", "粗斜体" }; + String[] sizeString = { "12", "14", "16", + "18", "20", "22", "24", "26", "28","30","32","34", "36"}; + JPanel panel1; + JButton Yes; + JButton Cancel; + JButton colour; + JComboBox FontName; + JComboBox FontStyle; + JComboBox FontSize; + JTextField jt; + Font font; + Color color; + int state = -1; + + setFont(){ + init(); + setContentPane(panel1); + setTitle("字体"); + setSize(400,200); + setLocationRelativeTo(null); + setModal(true); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + setVisible(true); + } + void init() { + //获取系统字体 + GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment(); + String[] systemFont = ge.getAvailableFontFamilyNames(); + + panel1 = new JPanel(); + panel1.setLayout(new BorderLayout(0, 0)); + final JPanel panel2 = new JPanel(); + panel2.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); + panel1.add(panel2, BorderLayout.SOUTH); + + Yes = new JButton(); + Yes.setText("完成"); + panel2.add(Yes); + Cancel = new JButton(); + Cancel.setText("取消"); + panel2.add(Cancel); + colour = new JButton(); + colour.setText("字体颜色..."); + panel2.add(colour); + + final JPanel panel3 = new JPanel(); + panel3.setLayout(new GridBagLayout()); + panel1.add(panel3, BorderLayout.NORTH); + + FontName = new JComboBox<>(systemFont); + FontName.setSelectedItem("宋体"); + GridBagConstraints gbc; + gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 1; + gbc.anchor = GridBagConstraints.WEST; + gbc.fill = GridBagConstraints.HORIZONTAL; + panel3.add(FontName, gbc); + + FontStyle = new JComboBox<>(faceString); + FontStyle.setSelectedItem("正常"); + gbc = new GridBagConstraints(); + gbc.gridx = 2; + gbc.gridy = 1; + gbc.anchor = GridBagConstraints.WEST; + gbc.fill = GridBagConstraints.HORIZONTAL; + panel3.add(FontStyle, gbc); + + final JLabel label1 = new JLabel(); + label1.setText("字体:"); + gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.WEST; + panel3.add(label1, gbc); + + final JLabel label2 = new JLabel(); + label2.setText("字形:"); + gbc = new GridBagConstraints(); + gbc.gridx = 2; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.WEST; + panel3.add(label2, gbc); + + FontSize = new JComboBox<>(sizeString); + FontSize.setSelectedItem("16"); + gbc = new GridBagConstraints(); + gbc.gridx = 4; + gbc.gridy = 1; + gbc.anchor = GridBagConstraints.WEST; + gbc.fill = GridBagConstraints.HORIZONTAL; + panel3.add(FontSize, gbc); + + final JLabel label3 = new JLabel(); + label3.setText("大小:"); + gbc = new GridBagConstraints(); + gbc.gridx = 4; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.WEST; + panel3.add(label3, gbc); + + jt = new JTextField(); + jt.setHorizontalAlignment(0); + jt.setText(s); + jt.setFont(new Font("宋体",Font.PLAIN,16)); + jt.setEditable(false); + panel1.add(jt, BorderLayout.CENTER); + + //为按钮和选项注册监听器 + Yes.addActionListener(this); + Cancel.addActionListener(this); + colour.addActionListener(this); + FontName.addActionListener(this); + FontSize.addActionListener(this); + FontStyle.addActionListener(this); + + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getSource()== Yes){ + state = 1; + jt.repaint(); + dispose(); + } + else if(e.getSource()==Cancel){ + state = 0; + jt.repaint(); + dispose(); + } + if(e.getSource() instanceof JComboBox) { + //获取选项 + String name = (String)FontName.getSelectedItem(); + int size = Integer.parseInt(Objects.requireNonNull(FontSize.getSelectedItem()).toString()); + String style = (String)FontStyle.getSelectedItem(); + int fontStyle = -1; + if (Objects.equals(style,"正常")){ + fontStyle = Font.PLAIN; + } + else if (Objects.equals(style,"粗体")){ + fontStyle = Font.BOLD; + } + else if (Objects.equals(style,"斜体")) { + fontStyle = Font.ITALIC; + } + else if (Objects.equals(style,"粗斜体")){ + fontStyle=Font.BOLD|Font.ITALIC; + } + font = new Font(name,fontStyle,size); //储存为字体类型 + jt.setFont(font); + jt.setText(s); + } + else if(e.getSource()==colour){ + color = JColorChooser.showDialog(jt,"颜色",null); + jt.setForeground(color); + } + } + + //获取state的值 + public int getState() { + return state; + } + + //获取字体Font + @Override + public Font getFont() { + return font; + } + + //获取颜色 + public Color getColor(){ + return color; + } + +}