介绍

1.菜单栏(文本,编辑,格式,关于)

2.文本子菜单及其功能

3.编辑子菜单及其功能

4.格式子菜单及其功能


5.关于

实现功能

1. 编辑器可以打开,保存,另存为,关闭文件。
2. 编辑器可以撤销,恢复,剪切,复制黏贴文本。
3. 编辑器可以设置编码和解码的格式(慎用)
4. 编辑器支持ctrl+s,ctrl+c,ctrl+v,ctrl+z,ctrl+y等快捷键。
5. 编辑器支持ctrl+鼠标滚轮放大和缩小字体。
6. 编辑器下方有状态栏,显示当前文本状态,字体大小以及有效字数统计。

入口index文件

index.java

package main;import main.TextEditBox;public class index {// 主函数public static void main(String[] args) {TextEditBox notePad = new TextEditBox();notePad.launchFrame();}
}

主体编辑器对象文件

阅读提示:从最后的launchFrame方法开始阅读本段代码会更加清晰

TextEditBox.java

package main;import main.tools;import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.*;
import java.io.*;import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.UndoManager;public class TextEditBox extends JFrame {/**** @author zzh* @Time 2020-7-23**/private static final long serialVersionUID = 1L;private boolean isChanged = false;private File file = null;private JMenuBar bar = null;private JMenu dJMenu = null;private JMenu eJMenu = null;private JMenu aJMenu = null;private JMenu cJMenu = null;private JMenu encodeItem = null;private JMenu decodeItem = null;private JMenuItem openItem = null;private JMenuItem saveItem = null;private JMenuItem saveAsItem = null;private JMenuItem closeItem = null;private JMenuItem undoItem = null;private JMenuItem redoItem = null;private JMenuItem cutItem = null;private JMenuItem copyItem = null;private JMenuItem pasteItem = null;private JRadioButton en_utf_8_Item = null;private JRadioButton en_gbk_Item = null;private JRadioButton de_utf_8_Item = null;private JRadioButton de_gbk_Item = null;private JMenuItem aboutItem = null;private JFileChooser jfc = null;private JTextArea ta = null;private JScrollPane scrollPane = null;private JPanel jDown = null;private JLabel labelLeft = null;private JLabel labelCenter = null;private JLabel labelRight = null;//编码格式private String encode = "UTF-8";private String decode = "UTF-8";// ctrl键是否按下private boolean key_ctrl = false;// 是否在打开文件private boolean isOpen = false;// 系统滚动条private MouseWheelListener sysWheel;// 文本域字体大小Font f = new Font("Serif", 0, 28);// 撤销的监听器UndoManager um = new UndoManager();public TextEditBox() {// 初始化jfc(文件选择器)jfc = new JFileChooser();}// 内部类private class event extends MouseAdapter {@Overridepublic void mouseWheelMoved(MouseWheelEvent e) {if (e.isControlDown()) {// 当ctrl键被按下,滚动为放大缩小// System.out.println(e.getWheelRotation());if (e.getWheelRotation() < 0 && f.getSize() < 60) {// 如果滚动条向前就放大文本f = new Font(f.getFamily(), f.getStyle(), f.getSize() + 1);ta.setFont(f);} else if (e.getWheelRotation() > 0 && f.getSize() > 0) {// 滚动条向后就缩小文本f = new Font(f.getFamily(), f.getStyle(), f.getSize() - 1);ta.setFont(f);}labelCenter.setText("字体大小:" + f.getSize());} else {// 当ctrl没有被按下,则为系统滚动scrollPane.addMouseWheelListener(sysWheel);sysWheel.mouseWheelMoved(e);// 触发系统滚动事件。scrollPane.removeMouseWheelListener(sysWheel);}}}// 内部类private class change implements DocumentListener {@Overridepublic void insertUpdate(DocumentEvent e) {changedUpdate(e);}@Overridepublic void removeUpdate(DocumentEvent e) {changedUpdate(e);}@Overridepublic void changedUpdate(DocumentEvent e) {changed();}public void changed() {if(!isOpen) {isChanged = true;labelLeft.setText("修改状态:已修改");// 统计字数labelRight.setText("字数:" + tools.replaceBlank(ta.getText()));}}}//重新打开读取public void openagainDialog() {isOpen = true;BufferedReader br = null;if (file != null) {String str = "";try {InputStreamReader fReader = new InputStreamReader(new FileInputStream(file),decode);br = new BufferedReader( fReader);ta.setText("");str = br.readLine();while (str != null) {ta.append(str + '\n');str = br.readLine();}} catch (FileNotFoundException e1) {ta.setText(ta.getText() + '\n' + "文件未找到");e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();} finally {if (br != null) {try {br.close();} catch (IOException e1) {e1.printStackTrace();}}isOpen = false;isChanged = false;labelLeft.setText("状态:已打开");this.setTitle(file.getName());labelRight.setText("字数:" + tools.replaceBlank(ta.getText()));}}}// 打开文件读取对话框的方法,打开控件调用此方法public void openOpenDialog() {isOpen = true;int status = jfc.showOpenDialog(TextEditBox.this);BufferedReader br = null;if (status == JFileChooser.APPROVE_OPTION) {file = jfc.getSelectedFile();String str = "";try {InputStreamReader fReader = new InputStreamReader(new FileInputStream(file),decode);br = new BufferedReader( fReader);ta.setText("");str = br.readLine();while (str != null) {ta.append(str + '\n');str = br.readLine();}} catch (FileNotFoundException e1) {ta.setText(ta.getText() + '\n' + "文件未找到");e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();} finally {if (br != null) {try {br.close();} catch (IOException e1) {e1.printStackTrace();}}isOpen = false;isChanged = false;labelLeft.setText("状态:已打开");this.setTitle(file.getName());labelRight.setText("字数:" + tools.replaceBlank(ta.getText()));}}}// 打开文件保存对话框的方法,保存和另存为时调用此方法public void openSaveDialog() {int status = jfc.showSaveDialog(TextEditBox.this);BufferedWriter bw = null;if (status == JFileChooser.APPROVE_OPTION) {file = jfc.getSelectedFile();try {OutputStreamWriter fWriter = new OutputStreamWriter(new FileOutputStream(file),encode);bw = new BufferedWriter(fWriter);String[] strs = ta.getText().split("\n");for (String str : strs) {bw.write(str);bw.newLine();bw.flush();}} catch (FileNotFoundException e1) {ta.setText(ta.getText() + '\n' + "文件未找到");e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();} finally {if (bw != null) {try {bw.close();} catch (IOException e1) {e1.printStackTrace();}}isChanged = false;labelLeft.setText("状态:已保存");this.setTitle(file.getName());}}}// 不打开文件保存对话框直接按照当前文件保存的方法public void onlySave() {BufferedWriter bw = null;try {OutputStreamWriter fWriter = new OutputStreamWriter(new FileOutputStream(file),encode);bw = new BufferedWriter(fWriter);String[] strs = ta.getText().split("\n");for (String str : strs) {bw.write(str);bw.newLine();bw.flush();}} catch (IOException e1) {e1.printStackTrace();} finally {if (bw != null) {try {bw.close();} catch (IOException e1) {e1.printStackTrace();}}isChanged = false;labelLeft.setText("状态:已保存");this.setTitle(file.getName());}}// 判断按钮是否可点击public void ifClick() {if (um.canUndo()) {undoItem.setEnabled(true);} else {undoItem.setEnabled(false);}if (um.canRedo()) {redoItem.setEnabled(true);} else {redoItem.setEnabled(false);}}// 全局按键事件监听public void addKeyListener() {Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {public void eventDispatched(AWTEvent event) {if (((KeyEvent) event).getID() == KeyEvent.KEY_RELEASED) {int key = ((KeyEvent) event).getKeyCode();// System.out.println(key);if (key == 17) {key_ctrl = false;}}if (((KeyEvent) event).getID() == KeyEvent.KEY_PRESSED) {int key = ((KeyEvent) event).getKeyCode();// System.out.println(key);if (key == 17) {key_ctrl = true;}if (key == 83 && key_ctrl == true) {System.out.println("ctrl+s");if (file == null) {openSaveDialog();} else {onlySave();}}if (key == 90 && key_ctrl == true) {System.out.println("ctrl+z");if (um.canUndo()) {// 撤销um.undo();}}if (key == 89 && key_ctrl == true) {System.out.println("ctrl+y");if (um.canRedo()) {// 恢复um.redo();}}}}}, AWTEvent.KEY_EVENT_MASK);}// 添加Bar各个组件的监听器public void addBarListener() {// 菜单栏焦点事件eJMenu.addMenuListener(new MenuListener() {@Overridepublic void menuCanceled(MenuEvent arg0) {menuSelected(arg0);}@Overridepublic void menuDeselected(MenuEvent arg0) {menuSelected(arg0);}@Overridepublic void menuSelected(MenuEvent arg0) {ifClick();}});// 关于NotePad触发监听器aboutItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(TextEditBox.this, "在此有关于<网文专家>的详细介绍……", e.getActionCommand(),JOptionPane.INFORMATION_MESSAGE);}});// 编辑栏的撤销、恢复、剪切、复制、粘贴监听器undoItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println((um.canUndo() ? "可" : "不可") + "撤销");if (um.canUndo()) {// 撤销um.undo();}ifClick();}});redoItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println((um.canRedo() ? "可" : "不可") + "恢复");if (um.canRedo()) {// 恢复um.redo();}ifClick();}});cutItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {ta.cut();}});copyItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {ta.copy();}});pasteItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {ta.paste();}});//格式栏的编码和解码en_utf_8_Item.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {encode = "UTF-8";}});en_gbk_Item.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {encode = "GBK";}});de_utf_8_Item.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("utf-8");decode = "UTF-8";openagainDialog();}});de_gbk_Item.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("gbk");decode = "GBK";openagainDialog();}});// 打开按键(如果文件没修改直接调用读取文件的文件选择对话框,修改了的话弹出提示框提示是否保存再进一步操作)openItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (isChanged == false) {openOpenDialog();} else if (file == null) {new JOptionPane();int result = JOptionPane.showConfirmDialog(TextEditBox.this, "文件还未保存,是否保存", "提示",JOptionPane.YES_NO_CANCEL_OPTION);// 选择是的时候调用保存文件的文件选择对话框,否的时候直接打开读取文件的文件选择对话框if (result == JOptionPane.YES_OPTION) {openSaveDialog();} else if (result == JOptionPane.NO_OPTION) {openOpenDialog();}} else if (file != null) {new JOptionPane();int result = JOptionPane.showConfirmDialog(TextEditBox.this, "文件还未保存,是否保存到" + file.getPath(), "提示",JOptionPane.YES_NO_CANCEL_OPTION);// 选择是的时候直接保存,否的时候打开读取文件的文件选择对话框if (result == JOptionPane.YES_OPTION) {onlySave();} else if (result == JOptionPane.NO_OPTION) {openOpenDialog();}}}});// 另存为按键saveAsItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {openSaveDialog();}});// 保存按钮监听saveItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (file == null) {openSaveDialog();} else {onlySave();}}});// 关闭的控件closeItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 如果修改未保存弹出对话框,保存了则直接退出if (isChanged == false) {System.exit(0);} else if (file == null) {new JOptionPane();int result = JOptionPane.showConfirmDialog(TextEditBox.this, "文件还未保存,是否保存", "提示",JOptionPane.YES_NO_CANCEL_OPTION);// 选择是的时候调用保存文件的文件选择对话框,否的时候直接退出if (result == JOptionPane.YES_OPTION) {openSaveDialog();} else if (result == JOptionPane.NO_OPTION) {System.exit(0);}} else if (file != null) {new JOptionPane();int result = JOptionPane.showConfirmDialog(TextEditBox.this, "文件还未保存,是否保存到" + file.getPath(), "提示",JOptionPane.YES_NO_CANCEL_OPTION);// 选择是的时候直接保存,否的时候直接退出if (result == JOptionPane.YES_OPTION) {onlySave();} else if (result == JOptionPane.NO_OPTION) {System.exit(0);}}}});}// 窗口的监听器public void myaddWindowListener() {this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {// 如果修改未保存弹出对话框,保存了则直接退出if (isChanged == false) {System.exit(0);} else if (file == null) {new JOptionPane();int result = JOptionPane.showConfirmDialog(TextEditBox.this, "文件还未保存,是否保存", "提示",JOptionPane.YES_NO_CANCEL_OPTION);// 选择是的时候调用保存文件的文件选择对话框,否的时候直接退出if (result == JOptionPane.YES_OPTION) {openSaveDialog();} else if (result == JOptionPane.NO_OPTION) {System.exit(0);}} else if (file != null) {new JOptionPane();int result = JOptionPane.showConfirmDialog(TextEditBox.this, "文件还未保存,是否保存到" + file.getPath(), "提示",JOptionPane.YES_NO_CANCEL_OPTION);// 选择是的时候直接保存,否的时候直接退出if (result == JOptionPane.YES_OPTION) {onlySave();} else if (result == JOptionPane.NO_OPTION) {System.exit(0);}}}});}// 加载文件菜单public void launchBar() {bar = new JMenuBar();dJMenu = new JMenu("文本");eJMenu = new JMenu("编辑");cJMenu = new JMenu("格式");aJMenu = new JMenu("关于");openItem = new JMenuItem("打开");saveItem = new JMenuItem("保存(ctrl+s)");saveAsItem = new JMenuItem("另存为");closeItem = new JMenuItem("关闭");undoItem = new JMenuItem("撤销(ctrl+z)");redoItem = new JMenuItem("恢复(ctrl+y)");cutItem = new JMenuItem("剪切(ctrl+x)");copyItem = new JMenuItem("复制(ctrl+c)");pasteItem = new JMenuItem("粘贴(ctrl+v)");encodeItem = new JMenu("编码");decodeItem = new JMenu("解码");en_utf_8_Item = new JRadioButton("UTF-8",true);en_gbk_Item = new JRadioButton("GBK",false);de_utf_8_Item = new JRadioButton("UTF-8",true);de_gbk_Item = new JRadioButton("GBK",false);//按钮分组ButtonGroup group1 = new ButtonGroup(); ButtonGroup group2 = new ButtonGroup();group1.add(en_utf_8_Item);group1.add(en_gbk_Item);group2.add(de_utf_8_Item);group2.add(de_gbk_Item);aboutItem = new JMenuItem("关于网文专家");setJMenuBar(bar);bar.add(dJMenu);bar.add(eJMenu);bar.add(cJMenu);bar.add(aJMenu);dJMenu.add(openItem);dJMenu.add(saveItem);dJMenu.add(saveAsItem);dJMenu.add(closeItem);eJMenu.add(undoItem);eJMenu.add(redoItem);eJMenu.add(cutItem);eJMenu.add(copyItem);eJMenu.add(pasteItem);cJMenu.add(encodeItem);cJMenu.add(decodeItem);aJMenu.add(aboutItem);encodeItem.add(en_utf_8_Item);encodeItem.add(en_gbk_Item);decodeItem.add(de_utf_8_Item);decodeItem.add(de_gbk_Item);}// 加载文本域public void launchTextArea() {ta = new JTextArea();ta.setFont(f);// 自动换行ta.setLineWrap(true);// 文本编辑了则触发监听器设置isChanged变量为true// 监听状态改变ta.getDocument().addDocumentListener(new change());// 监听撤销ta.getDocument().addUndoableEditListener(new UndoableEditListener() {// 注册撤销可编辑监听器public void undoableEditHappened(UndoableEditEvent e) {um.addEdit(e.getEdit());}});// 编辑撤销的监听// 文本域滚动条scrollPane = new JScrollPane(ta);scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);sysWheel = scrollPane.getMouseWheelListeners()[0];// 得到系统滚动事件scrollPane.removeMouseWheelListener(sysWheel);// 移除系统滚动,需要时添加scrollPane.addMouseWheelListener(new event());add(scrollPane, BorderLayout.CENTER);}// 加载Label的板块public void launchLabel() {jDown = new JPanel(); // Label的板块labelLeft = new JLabel("修改状态:未修改");labelCenter = new JLabel("字体大小:" + f.getSize());labelRight = new JLabel("字数:" + tools.replaceBlank(ta.getText()));jDown.setLayout(new GridLayout(1, 5));jDown.add(labelLeft);jDown.add(labelCenter);jDown.add(labelRight);add(jDown, BorderLayout.SOUTH);}// 加载整个窗口public void launchFrame() {setBounds(20, 20, 1000, 800);setTitle("网文专家v1.1");setLayout(new BorderLayout());// 加载文件菜单this.launchBar();// 加载文本域this.launchTextArea();// 加载Label的板块this.launchLabel();// 按钮组件监听this.addBarListener();// 全局按键事件监听this.addKeyListener();// 窗口的监听器this.myaddWindowListener();setVisible(true);// 设置JFram不要默认关闭,为了用对话框触发退出setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);}
}

工具tools文件

tools.java

package main;public class tools {// 字符串去无效字符(空格,制表符,换行,标点等)后的长度.public static int replaceBlank(String str) {String dest = "";if (str != null) {str = str.replaceAll("[\\pP‘’“”]", "");dest = str.replaceAll("\\s*|\t|\r|\n", "");}return dest.length();}
}

实现难点1 ---- 如何实现快捷键ctrl+任意键位

在Java的swing图形界面中,键位识别都是单个的,没有直接可以使用的组合键,这个时候要实现组合键的功能可以利用按键按下状态(KeyEvent.KEY_RELEASED or KeyEvent.KEY_PRESSED)和一个boolean值,例如,当ctrl键按下,这时让bool为true,这时按下其他的按键就可以实现组合,一旦ctrl键释放,bool为false,组合键失效。(代码参照TextEditBox.java的285行,addKeyListener方法)

实现难点2 ---- 如何实现有效字数的统计

ta.getDocument().addDocumentListener(new change());
用上面的方法给输入文本框绑定自己的DocuListener事件,方法的参数是106行的第二个内部类,它实现了DocumentListener接口,重写了change方法,每次用户输入都统计一次有效字数。
这里的有效字数是调用tools.java中的replaceBlank方法,利用正则匹配消除掉字符串中的无效字符(空格,制表符,换行,标点等)。

实现难点3 ---- 如何实现ctrl+鼠标滚轮控制字体大小

自定义自己的鼠标滚轮事件,并替换掉系统的鼠标滚轮事件。参照TextEditBox.java代码602到608行。这里的自定义鼠标事件是第一个内部类的实例,在84行的第一个内部类继承了MouseAdapter,重写了mouseWheelMoved事件。

和windows自带编辑器的对比

1. 在打开一个大文本的速度上两者相差无几。
2. 基本功能都可以复原windows自带的编辑器,除了一些查找替换的功能还没有实现(利用正则应该不难实现,可以拓展)。
3. windows自带编辑器似乎没有修改编码格式的功能。没有统计有效字数的功能。

总的来说和windows编辑器相差不多,并且代码可以再做优化拓展。

如代码实现有误,或者有更好的实现方法,请在评论区留言。

用java实现的文本编辑器可以媲美windows自带的编辑器吗?(功能全,超详细)相关推荐

  1. JAVA内存泄露分析和解决方案及WINDOWS自带查看工具

    JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...

  2. java模拟计算器_java 计算器 (模仿windows自带计算器的功能和界面)

    [java]代码库import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import jav ...

  3. Java 简单的用户管理系统(代码注释超全超详细!!!)

    1.简介 本项目是个java开发的简单的用户管理系统,因为能力有限,我做的界面丑陋了些,大家见谅 实现的功能:登录.添加用户.修改用户(修改的时候用户原始数据显示到界面上.单个删除用户和多个删除用户. ...

  4. java 实现发送手机验证码的功能 (超详细)

    我这里使用的旦米(http://www.danmi.com/)你们用阿里的就去看看其他博客 1.首先注册一个旦米的账号,第一次注册会免费的送你10元.足够你去测试用,不用担心自己去充钱. 2.注册好了 ...

  5. java软件工程师---2023年大学生职业生涯规划大赛职业生涯规划书(巨全巨详细)---禁止转载、抄袭,已参赛仅供参考

    目录 职业体验感悟(800 -1000 字) 1.自我认知(主要从优劣势.个人兴趣等方面分析自我,并运用人才测评工具评估,1000字左右) (一)自我盘点(扇形图) (二)职业兴趣(霍兰德职业兴趣测试 ...

  6. B站韩顺平老师超全超详细的Java企业级学习路线图(后期整理每一小部分的学习内容)

  7. java版本匠魂下载教程_匠魂工具怎么升级?这篇超详细教程攻略请收下

    哈喽大家好我是雪兔!今天兔子要给大家讲的是:匠魂工具的更换升级 匠魂工具的更换升级 首先我们要搞清楚为什么要给工具更换升级? 很多萌新刚开始玩匠魂的时候都很头大,我怎么挖不了铁?怎么挖不了黑曜石?这就 ...

  8. java html文本编辑器,基于Java WebHTML在线文本编辑器解决方案.doc

    基于Java WebHTML在线文本编辑器解决方案 基于Java WebHTML在线文本编辑器解决方案 摘要:FckEditor作为众多优秀HTML在线文本编辑器之一,以其支持多语言的优势而受到众多国 ...

  9. java集成富文本编辑器UEditor

    JAVA集成富文本编辑器UEditor 集成前说明 集成UEditor 一.UEditor下载 二.UEditor迁入项目 三.引入ueditor中的js 四.初始化UEditor 五.实现图片上传 ...

最新文章

  1. ICLR 2020论文投稿2600篇,GNN、BERT、Transformer领跑热门研究方向
  2. 建造者模式(Builder)
  3. 向量时钟同步算法_如何让超级下载算法在不同CortexM内核下也能跑?
  4. SpringMVC 使用hibernate返回list
  5. ReactJS入门之ReactJS简介
  6. .NET 6 Preview 3 发布
  7. 自己的php工具,用PHP自己编写的站长工具箱
  8. v$session v$session_wait
  9. open cv+C++错误及经验总结(十三)
  10. 想知道电脑录屏软件哪个好用?这三个工具轻松实现屏幕录制
  11. NFS PRC端口映射器
  12. php调java_php调java接口
  13. python编写摇骰子游戏_Python使用tkinter实现摇骰子小游戏功能的代码
  14. Unity3D项目之游戏场景小地图制作
  15. Pandas数据分析教程(2)-数据读取之普通索引、loc/iloc索引
  16. 云计算是什么,云计算发展现状是什么?
  17. 36艺教育完成3000万元Pre-A轮融资,星火资本投资
  18. 计算机工作自动化的特点,计算机内部自动化操作等特点.doc
  19. Spring Boot入门系列(六)Spring Boot如何整合Mybatis【附详细步骤】
  20. 当mathpix 免费次数用完了怎么办?

热门文章

  1. for循环打印等腰三角形
  2. android设备获取 关于手机-》手机名称
  3. 独家解读:你所不知道的阿里1688
  4. maven配置项目根路径_Maven 基本概念——根目录、项目创建、坐标
  5. PDF box 结合POI 将pdf转为PPT
  6. 基于分布式光纤应变感知的铁路重点线路(区段)隧道监测设计
  7. auc指标含义的理解
  8. 解决ssh packet_write_wait: Connection to 192.168.xx.xx port 22: Broken pipe的问题
  9. 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)
  10. c语言关键词中英翻译机编程,C语言关键字中英翻译机.doc