实现一个基本的Windows下记事本的功能 PS最后附上GitHub源代码下载地址
首先要编写记事本,需要知道记事本的功能有哪些,然后把框架搭建起来
模块框架划分
主要分为四个部分:
(1)图形框架的初始化
(2)记事本菜单栏及菜单栏中菜单选项的初始化
(3)文本编辑区功能的实现
(4)文件的处理
1。。。首先介绍图形框架的搭建:
首先新建类MyFrame继承自JFrame,这个类主要是用来初始化GUI界面
public class MyFrame extends JFrame
然后为了接下来整个代码的编写的易读性,将框架初始化写成函数,
这个函数时框架的初始化:主要设置框架的大小和图标
public void initFrame(){
//Properties p = new Properties();
//通过获取系统屏幕的分辨率设置窗体大小位置
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
this.setSize(screenWidth/2, screenHeight/2);
//this.setSize(640,480);
this.setLocationRelativeTo(null);
//设置主对话框可以被关闭
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置图标
Image img = new ImageIcon("image/logo.jpg").getImage();
this.setIconImage(img);
//设置标题名称
this.setTitle("记事本 by Wilson");
}//初始化窗体结束
2。。。设置菜单栏及其菜单选项
从windows中的记事本可以看到菜单栏中有“文件”“编辑”“格式”“查看”“帮助”五个菜单,每个下面有许多个菜单选项,
(1)首先就是先把这些菜单的内容先简单的添加进去,
public void initMenu() {
JMenuBar menuBar = new JMenuBar(); //创建一个菜单栏
setJMenuBar(menuBar); //将菜单栏添加到框架上
//创建文件菜单
fileMenu = new JMenu("文件(F)");
fileMenu.setMnemonic('F'); //设置快捷键Alt+F
menuBar.add(fileMenu);
fileNew = new JMenuItem("新建(N)"); //新建菜单项
//设置快捷键
fileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
fileNew.addActionListener(this); //添加事件监听
fileMenu.add(fileNew); //添加菜单项
fileOpen = new JMenuItem("打开(O)");
fileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
fileOpen.addActionListener(this);
fileMenu.add(fileOpen);
fileSave = new JMenuItem("保存(S)");
fileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
fileSave.addActionListener(this);
fileMenu.add(fileSave);
fileSaveAs = new JMenuItem("另存为(A)...");
fileSaveAs.addActionListener(this);
fileMenu.add(fileSaveAs);
fileMenu.addSeparator();
filePageSet = new JMenuItem("页面设置(U)...");
filePageSet.addActionListener(this);
fileMenu.add(filePageSet);
filePrint = new JMenuItem("打印(P)");
filePrint.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK));
filePrint.addActionListener(this);
fileMenu.add(filePrint);
fileMenu.addSeparator();
fileExit = new JMenuItem("退出“X");
fileExit.addActionListener(this);
fileMenu.add(fileExit);
//创建编辑菜单
editMenu = new JMenu("编辑(E)");
editMenu.setMnemonic('E');
menuBar.add(editMenu);
//当选择编辑菜单时,设置剪切、复制、粘贴、删除等功能的可用性
editMenu.addMenuListener(new MenuListener(){
public void menuCanceled(MenuEvent e) { //当取消菜单的时候调用
checkMenuItemEnabled(); //设置功能的可用性
}
public void menuDeselected(MenuEvent e) { //当取消选择某个菜单时选择使用
checkMenuItemEnabled();
}
public void menuSelected(MenuEvent e) { //当选择某个菜单时调用
checkMenuItemEnabled();
}
});
editUndo = new JMenuItem("撤销(U)");
editUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, ActionEvent.CTRL_MASK));
editUndo.addActionListener(this);
editUndo.setEnabled(false); //设置没有写入文字之前不可用
editMenu.add(editUndo);
editCut = new JMenuItem("剪切(T)");
editCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
editCut.addActionListener(this);
editCut.setEnabled(false);
editMenu.add(editCut);
editCopy = new JMenuItem("复制(C)");
editCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
editCopy.addActionListener(this);
editCopy.setEnabled(false);
editMenu.add(editCopy);
editPaste = new JMenuItem("粘贴(P)");
editPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK));
editPaste.addActionListener(this);
editPaste.setEnabled(false);
editMenu.add(editPaste);
editDelete = new JMenuItem("删除(L)");
editDelete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
editDelete.addActionListener(this);
editMenu.add(editDelete);
editMenu.addSeparator();
editFind = new JMenuItem("查找(F)");
editFind.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, ActionEvent.CTRL_MASK));
editFind.addActionListener(this);
editMenu.add(editFind);
editFindNext = new JMenuItem("查找下一个(N)");
editFindNext.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3, 0));
editFindNext.addActionListener(this);
editMenu.add(editFindNext);
editReplace = new JMenuItem("替换(R)...");
editReplace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.CTRL_MASK));
editReplace.addActionListener(this);
editMenu.add(editReplace);
editGoTo = new JMenuItem("转到(G)...");
editGoTo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, ActionEvent.CTRL_MASK));
editGoTo.addActionListener(this);
editMenu.add(editGoTo);
editMenu.addSeparator();
editSelectAll = new JMenuItem("全选(A)");
editSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK));
editSelectAll.addActionListener(this);
editMenu.add(editSelectAll);
editDate = new JMenuItem("时间/日期(D)");
editDate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
editDate.addActionListener(this);
editMenu.add(editDate);
//创建格式菜单
formatMenu = new JMenu("格式(O)");
formatMenu.setMnemonic('O');
menuBar.add(formatMenu);
formatLineWrap = new JMenuItem("自动换行(W)");
formatLineWrap.setMnemonic('W');
//formatLineWrap.setState(true);
formatLineWrap.addActionListener(this);
formatMenu.add(formatLineWrap);
formatFont = formatMenu.add(new JMenuItem("字体(F)"));
formatFont.addActionListener(this);
//创建查看菜单
viewMenu = menuBar.add(new JMenu("查看(V)"));
viewMenu.setMnemonic('V');
stateItem = viewMenu.add(new JCheckBoxMenuItem("状态栏(S)", true)); //状态栏一开始就被选中
stateItem.addActionListener(this);
//创建帮助菜单
helpMenu =menuBar.add( new JMenu("帮助(H)"));
helpMenu.setMnemonic('H');
lookHelp = helpMenu.add(new JMenuItem("查看帮助(H)"));
lookHelp.addActionListener(this);
helpMenu.addSeparator();
aboutNote = helpMenu.add(new JMenuItem("关于笔记本(A)"));
aboutNote.addActionListener(this);
}
其实主要就是利用JMenu这个类来创建菜单,然后用JMenuItem这个类将菜单选项添加进去,至于快捷键和事件监听也是很简单的重复
到此为止,我们把能看到的界面整个搭建完成,至于菜单栏功能的实现
请参照JAVA——Swing应用编写简单的记事本——源代码分析实战(二)
https://blog.csdn.net/wilsonsong1024/article/details/79657956
JAVA——Swing应用编写简单的记事本——源代码分析实战(二)里有些偏僻功能如页面设置,打印,转到,替换这些功能的具体的介绍。