如有意见可以评价,转载请标明出处,谢谢!
这段时间开始学JAVA,想通过编一些小的程序来加深对JAVA语言的学习,后来决定从记事本这个程序开始,花了一段时间总算写好了,现在和大家分手一下实现的过程。
记事本程序主要是通过菜单项和工具栏按键来操作文件的一种应用程序,顾名思义,我们需要定义一个窗体,并向这个窗体中添加菜单和工具栏。这里我使用的是用JFrame作为主窗体。一般不拿JDialog作为主窗体,JDialog可以从属于一个JFrame,JWindow也可以作为主窗体。
首先我们定义一个类,继承JFrame,从而让我们定义的类能具备一般窗体的特性。
class Nodepad5 extends JFrame
接下来我们需要定义一些主窗体中需要的各种菜单项和工具栏选项。现在我们分析一下,从记事本的功能上来看,我们需要四个菜单项,分别是文件(实现文件的打开,保存等功能),编辑(实现文本复制,剪切,粘贴,查找和替换,全选等功能),格式(用于设置文本的字体格式)和帮助(提供记事本的操作说明和作者的简介)。工具栏用来将一些常用的功能放在上面便于操作。
下面是控件的定义:
//定义菜单栏 JMenuBar jmb; //定义菜单项 JMenu jmenu_file,jmenu_edit,jmenu_format,jmenu_help; //定义File菜单下的子菜单 JMenuItem file_new,file_open,file_save,file_saveas,file_exit; //定义Edit菜单下的子菜单 JMenuItem edit_copy,edit_cut,edit_paste,edit_delete,edit_find,edit_replace,edit_allselected; //定义Format下的子菜单 JMenuItem format_charstyle; //定义Help菜单下的子菜单 JMenuItem help_instructions,help_productinfo; //定义工具条 JToolBar jtb; //定义工具栏中的工具选项 JButton jbutton_new,jbutton_open,jbutton_save,jbutton_saveas,jbutton_paste,jbutton_copy,jbutton_cut; //定义文本输入框 JTextArea jta_message; JScrollPane jsp_message;
当然,我们不要忘了,记事本是对文件进行操作的,我们还需要定义操作文件的一下变量,如下所示:
//定义文件路径与文件名 String filefullpath=null; String filename=null; String content=null; FileReader selectedfile=null; BufferedReader selectedfilebuffer=null; FileWriter fileselected=null; BufferedWriter fileselectedbuffer=null;
定义了控件之后就是创建控件的实例并添加到窗体中,菜单项的处理程序如下所示:
//创建菜单栏 jmb=new JMenuBar(); //创建四个菜单项和助记符 jmenu_file=new JMenu("文件(F)"); jmenu_file.setMnemonic('F'); jmenu_edit=new JMenu("编辑(E)"); jmenu_file.setMnemonic('E'); jmenu_format=new JMenu("格式(O)"); jmenu_file.setMnemonic('O'); jmenu_help=new JMenu("帮助(H)"); jmenu_file.setMnemonic('H'); //创建File子菜单 file_new=new JMenuItem("新建",new ImageIcon("NodepadImage/new1.jpg")); file_open=new JMenuItem("打开..."); file_save=new JMenuItem("保存",new ImageIcon("NodepadImage/savedocument.jpg")); file_saveas=new JMenuItem("另存为...",new ImageIcon("NodepadImage/saveas.jpg")); file_exit=new JMenuItem("退出",new ImageIcon("NodepadImage/stop.jpg")); //将File菜单下内容添加到File菜单中 jmenu_file.add(file_new); jmenu_file.add(file_open); jmenu_file.add(file_save); jmenu_file.add(file_saveas); jmenu_file.addSeparator(); jmenu_file.add(file_exit); //为File下各项添加监听 file_new.addActionListener(this); file_new.setActionCommand("new"); file_open.addActionListener(this); file_open.setActionCommand("open"); file_save.addActionListener(this); file_save.setActionCommand("save"); file_saveas.addActionListener(this); file_saveas.setActionCommand("saveas"); file_exit.addActionListener(this); file_exit.setActionCommand("exit"); //创建Edit下的子项 edit_copy=new JMenuItem("复制",new ImageIcon("NodepadImage/copy1.jpg")); edit_cut=new JMenuItem("剪切",new ImageIcon("NodepadImage/cut.jpg")); edit_paste=new JMenuItem("粘贴"); edit_delete=new JMenuItem("删除",new ImageIcon("NodepadImage/delete.jpg")); edit_find=new JMenuItem("查找...",new ImageIcon("NodepadImage/find.jpg")); edit_replace=new JMenuItem("替换..."); edit_allselected=new JMenuItem("全选"); //添加子项到Edit菜单中 jmenu_edit.add(edit_copy); jmenu_edit.add(edit_cut); jmenu_edit.add(edit_paste); jmenu_edit.add(edit_delete); jmenu_edit.addSeparator(); jmenu_edit.add(edit_find); jmenu_edit.add(edit_replace); jmenu_edit.addSeparator(); jmenu_edit.add(edit_allselected); //为Edit下的子项添加监听 edit_copy.addActionListener(this); edit_copy.setActionCommand("copy"); edit_cut.addActionListener(this); edit_cut.setActionCommand("cut"); edit_paste.addActionListener(this); edit_paste.setActionCommand("paste"); edit_delete.addActionListener(this); edit_delete.setActionCommand("delete"); edit_find.addActionListener(this); edit_find.setActionCommand("find"); edit_replace.addActionListener(this); edit_replace.setActionCommand("replace"); edit_allselected.addActionListener(this); edit_allselected.setActionCommand("allselected"); //创建Format下的子项 format_charstyle=new JMenuItem("字体...",new ImageIcon("NodepadImage/font.jpg")); //添加子项到Format菜单中 jmenu_format.add(format_charstyle); //为Format下的菜单添加事件监听 format_charstyle.addActionListener(this); format_charstyle.setActionCommand("setfont"); //创建Help下的子项 help_instructions=new JMenuItem("操作说明"); help_productinfo=new JMenuItem("作品信息"); //添加子项到Help菜单中 jmenu_help.add(help_instructions); jmenu_help.add(help_productinfo); //添加监听 help_instructions.addActionListener(this); help_instructions.setActionCommand("instruction"); help_productinfo.addActionListener(this); help_productinfo.setActionCommand("author"); //将File,Edit,Format和Help菜单添加到菜单栏 jmb.add(jmenu_file); jmb.add(jmenu_edit); jmb.add(jmenu_format); jmb.add(jmenu_help); //设置菜单栏 this.setJMenuBar(jmb);
工具栏的控件创建与添加如下所示:
//创建工具栏 //jtb=new JToolBar(JToolBar.VERTICAL); jtb=new JToolBar(JToolBar.HORIZONTAL); //创建工具选项 jbutton_new=new JButton(new ImageIcon("NodepadImage/new1.jpg")); //显示工具对应的功能 jbutton_new.setToolTipText("新建"); jbutton_open=new JButton(new ImageIcon("NodepadImage/open.jpg")); jbutton_open.setToolTipText("打开"); jbutton_copy=new JButton(new ImageIcon("NodepadImage/copy1.jpg")); jbutton_copy.setToolTipText("复制"); jbutton_save=new JButton(new ImageIcon("NodepadImage/savedocument.jpg")); jbutton_save.setToolTipText("保存"); jbutton_saveas=new JButton(new ImageIcon("NodepadImage/saveas.jpg")); jbutton_saveas.setToolTipText("另存为"); jbutton_cut=new JButton(new ImageIcon("NodepadImage/cut.jpg")); jbutton_cut.setToolTipText("剪切"); jbutton_paste=new JButton(new ImageIcon("NodepadImage/paste1.jpg")); jbutton_paste.setToolTipText("粘贴"); //为工具栏中的按键添加监听 jbutton_new.addActionListener(this); jbutton_new.setActionCommand("new"); jbutton_open.addActionListener(this); jbutton_open.setActionCommand("open"); jbutton_save.addActionListener(this); jbutton_save.setActionCommand("save"); jbutton_saveas.addActionListener(this); jbutton_saveas.setActionCommand("saveas"); jbutton_copy.addActionListener(this); jbutton_copy.setActionCommand("copy"); jbutton_cut.addActionListener(this); jbutton_cut.setActionCommand("cut"); jbutton_paste.addActionListener(this); jbutton_paste.setActionCommand("paste"); //添加子项到工具栏 jtb.add(jbutton_new); jtb.add(jbutton_open); jtb.add(jbutton_save); jtb.add(jbutton_saveas); jtb.add(jbutton_copy); jtb.add(jbutton_cut); jtb.add(jbutton_paste); //绘制工具栏边框 jtb.setBorderPainted(true); //将工具栏添加到窗体右边 //this.add(jtb,BorderLayout.EAST); this.add(jtb,BorderLayout.NORTH);
当然,记事本中肯定需要有文本输入和输出的地方啊,我们可以使用一个JTextArea来实现,
//创建文本输入窗口 jta_message=new JTextArea(); jsp_message=new JScrollPane(jta_message); this.add(jsp_message,BorderLayout.CENTER);
各种需要的控件添加了以后,就需要添加监听程序了,如下所示:
public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("open")) { JFileChooser opendialog=new JFileChooser(); opendialog.setDialogTitle("请选择文件..."); int result=opendialog.showOpenDialog(null); if(result==JFileChooser.APPROVE_OPTION) { filefullpath=opendialog.getSelectedFile().getAbsolutePath(); filename=opendialog.getSelectedFile().getName(); try { selectedfile=new FileReader(filefullpath); selectedfilebuffer=new BufferedReader(selectedfile); String filecontent=""; String temp; while((temp=selectedfilebuffer.readLine())!=null) { filecontent+=temp+"\r\n"; } this.jta_message.setText(filecontent); this.content=filecontent; }catch(Exception error) { error.printStackTrace(); }finally { try { selectedfilebuffer.close(); selectedfile.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }else if(e.getActionCommand().equals("new")) { System.out.println("进入新建监听程序"); this.jta_message.setText(""); }else if(e.getActionCommand().equals("save")) { if(!this.content.equals(this.jta_message.getText())) { try { fileselected=new FileWriter(this.filefullpath); fileselectedbuffer=new BufferedWriter(fileselected); String filecontent=this.jta_message.getText(); this.content=filecontent; fileselectedbuffer.write(filecontent); }catch(Exception error) { error.printStackTrace(); }finally { try { fileselectedbuffer.close(); fileselected.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }else if(e.getActionCommand().equals("saveas")) { JFileChooser saveasdialog=new JFileChooser(); saveasdialog.setDialogTitle("另存为..."); int result=saveasdialog.showSaveDialog(null); if(result==JFileChooser.APPROVE_OPTION) { filefullpath=saveasdialog.getSelectedFile().getAbsolutePath(); filename=saveasdialog.getSelectedFile().getName(); try { fileselected=new FileWriter(this.filefullpath); fileselectedbuffer=new BufferedWriter(fileselected); String filecontent=this.jta_message.getText(); this.content=filecontent; fileselectedbuffer.write(filecontent); }catch(Exception error) { error.printStackTrace(); }finally { try { fileselectedbuffer.close(); fileselected.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }else if(e.getActionCommand().equals("exit")) { System.exit(0); }else if(e.getActionCommand().equals("copy")) { this.jta_message.copy(); }else if(e.getActionCommand().equals("cut")) { this.jta_message.cut(); }else if(e.getActionCommand().equals("paste")) { this.jta_message.paste(); }else if(e.getActionCommand().equals("delete")) { this.jta_message.replaceSelection(""); }else if(e.getActionCommand().equals("find")) { finddialog=new Find(this); }else if(e.getActionCommand().equals("replace")) { System.out.println("创建替换窗口前!"); if(replacedialog!=null) { replacedialog.dispose(); } replacedialog=new Replace(this); System.out.println("创建替换窗口后!"); }else if(e.getActionCommand().equals("allselected")) { this.jta_message.selectAll(); }else if(e.getActionCommand().equals("setfont")) { fontdialog=new MyFont(this); }else if(e.getActionCommand().equals("author")) { Author author=new Author(this); }else if(e.getActionCommand().equals("instruction")) { Instruction instruction=new Instruction(this); } }
这样,通过上面的介绍,我们我就完成了主窗体的设计了。在主窗体中我们还需要用到查找和替换两个子窗体和一个字体格式设置对话框,这两个子窗体大家可以自己进行设计,在调用子窗体的时候只需给子窗体传一个主窗体的引用就可以了。至于字体设置对话框,我在另外一篇博客中详细的讲述了,大家可以去看看那篇文章,名字叫“JAVA语言版之字体格式设置编程实现”。
效果图如下所示:
1.主界面
2.查找界面
3.替换界面
4.字体格式设置对话框