1、第第1717章章 简易记事本简易记事本工具栏与菜单工具栏与菜单 能力目标:能力目标:学会使用工具栏、菜单栏和弹出(快捷)菜单。能运用工具栏、菜单、文件对话框和文件读写流等编写简易记事本程序。内容介绍17.1 任务预览17.2 JToolBar工具栏17.3 菜单17.4 JPopupMenu弹出菜单17.5 简易记事本17.6 本章小结17.7 实训17:简易记事本17.1 任务预览 本章实训程序运行结果:17.2 JToolBar工具栏 工具栏属于容器,一般安置在边框布局的窗框上部。程序运行后用鼠标把工具栏拖到左边、右边、下部或中部。工具栏类JToolBar的构造方法有4个:(1)JTool
2、Bar():构造一个工具栏,默认为HORIZONTAL水平方向。(2)JToolBar(int orientation):构造指定方向的工具栏。(3)JToolBar(String name):构造指定名称的工具栏。名称用作浮动式工具栏的标题。(4)JToolBar(String name,int orientation)JToolBar最常用方法:继承Container类的add(Componentadd(Component comp)comp)方法方法,添加按钮等组件到工具栏【例17-1】编程,在窗框的上部放工具栏,上面放3个带图标的按钮。窗框中部放置带滚动窗格的文本区。class Fra
3、me1 extends JFrame JToolBar toolBar=new JToolBar();ImageIcon iconCut=new ImageIcon(cut.gif);ImageIcon iconCopy=(copy.gif);ImageIcon iconPaste=(paste.gif);JButton buttonCut=new JButton(剪切,iconCut);JButton buttonCopy=(复制,iconCopy);JButton buttonPaste=(粘贴,iconPaste);JTextArea textArea=new JTextArea();J
4、ScrollPane scrollPane=new JScrollPane(textArea);public Frame1()this.setTitle(带工具栏的窗框);this.setBounds(100,200,240,220);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);initialize();this.setVisible(true);private void initialize()toolBar.add(buttonCut);this.add(toolBar,BorderLayout.NORTH);this.add(s
5、crollPane,BorderLayout.CENTER);public class Example1 public static void main(String args)new Frame1();17.3 菜单 菜单有两大类:菜单栏和弹出菜单。菜单栏JMenuBar:也叫主菜单,由若干个菜单“按钮”排成一行构成。单击菜单“按钮”JMenu,则会出现一个下拉菜单(列表)下拉菜单由多个菜单项(菜单命令)JMenuItem 组成。菜单和菜单项都可设置键盘助记符(Mnemonic),运行时可使用键盘组合键“Alt+助记符”激活或执行菜单。助记符带下划线显示。还可对菜单项设置快捷键(英文是Acc
6、elerator,故也叫“加速器”),例如“退出”菜单中的Ctrl+E。菜单栏、菜单和菜单项都是组件,每个组件都是类的对象。【例17-2】在例17-1程序基础上,增加菜单栏。class Frame2 extends Frame1 JMenuBar menuBar=new JMenuBar();JMenu menuFile=new JMenu(文件(F);JMenu menuEdit=new JMenu(编辑);JMenu menuHelp=new JMenu(帮助(H);JMenuItem menuItemFileNew=new JMenuItem(新建);JMenuItem menuItem
7、FileOpen=new JMenuItem(打开);JMenuItem menuItemFileSaveAs=new JMenuItem(另存为);JMenuItem menuItemFileExit=new JMenuItem(退出(X);JCheckBoxMenuItem checkBoxMenuItemEditAutoWrap=new JCheckBoxMenuItem(自动换行);JMenuItem menuItemEditCut=new JMenuItem(剪切);JMenuItem menuItemEditCopy=new JMenuItem(复制);JMenuItem menu
8、ItemEditPaste=new JMenuItem(粘贴);JMenuItem menuItemHelpAbout=new JMenuItem(关于(A);public Frame2()this.setTitle(带菜单栏的窗框);initialize();this.setVisible(true);private void initialize()menuFile.setMnemonic(KeyEvent.VK_F);/菜单助记符F键menuHelp.setMnemonic(KeyEvent.VK_H);menuItemFileExit.setMnemonic(KeyEvent.VK_X
9、);menuItemHelpAbout.setMnemonic(KeyEvent.VK_A);/设置“退出”菜单项加速器(即快捷键)Ctrl+E:menuItemFileExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,KeyEvent.CTRL_DOWN_MASK,true);menuFile.add(menuItemFileNew);/添加“文件”菜单项menuFile.add(menuItemFileOpen);menuFile.add(menuItemFileSaveAs);menuFile.addSeparator();
10、/添加菜单项分隔符menuFile.add(menuItemFileExit);menuEdit.add(checkBoxMenuItemEditAutoWrap);menuEdit.addSeparator();menuEdit.add(menuItemEditCut);menuEdit.add(menuItemEditCopy);menuEdit.add(menuItemEditPaste);menuHelp.add(menuItemHelpAbout);menuBar.add(menuFile);/添加菜单栏菜单 menuBar.add(menuEdit);menuBar.add(men
11、uHelp);this.setJMenuBar(menuBar);/窗框设置菜单栏/“退出”菜单项添加动作事件监听器:menuItemFileExit.addActionListener(new ActionListener()System.exit(0););17.3.1 JMenuBar菜单栏 菜单栏是由菜单组成的条状容器组件,上面可放多个菜单或菜单项。菜单栏类JMenuBar的常用方法:(1)JMenuBar():构造一个菜单栏。(2)JMenu add(JMenu c):在菜单栏中添加菜单。(3)Component add(Component comp,int index):这是从Co
12、ntainer类继承而来的方法,功能是将组件(菜单或菜单项等)添加到菜单栏指定的位置。索引位置从0开始,如果是-1,则添加到最后位置。17.3.2 JMenu菜单 菜单也是个容器,在上面放置菜单项或其它菜单。菜单栏上的菜单,运行时被选中,将出现“下拉菜单”。JMenu继承JMenuItem,即菜单是特殊的菜单项。JMenu的常用方法:(1)JMenu(String s):构造指定文本的菜单。(2)JMenuItem add(JMenuItem menuItem):添加菜单项。(3)JMenuItem insert(JMenuItem mi,int pos):插入菜单项。(4)void addS
13、eparator():在菜单中添加分隔符。分隔符是JSeparator类的组件,用于菜单或工具栏作分隔。(5)Component add(Component c):添加组件到菜单。在菜单menuFile中添加分隔符,有两种方法:menuFile.addSeparator();menuFile.add(new JSeparator();(6)void remove(JMenuItem item)(7)void remove(int pos)(8)void setMnemonic(int mnemonic):在菜单中设置键盘助记符。键盘助记符是键盘事件类KeyEvent的静态常量字段,有VK_0、
14、VK_1、VK_9、VK_A、VK_B、VK_Z等,用于表示键盘上的按键。设置了键盘助记符的菜单,程序运行时按Alt加上对应的按键激活。设置了助记符的菜单,在菜单的文本中可放置助记符字符,例如“文件(F)”,程序运行时,助记符“F”加下划线显示。注意:KeyEvent常量字段中的VK表示“虚拟键”,这是与平台无关的一种按键表示法。虚拟键的作用是报告按下了键盘上的哪个键。17.3.3 JMenuItem菜单项 菜单项是菜单列表中的菜单命令。JMenuItem常用方法:(1)JMenuItem(String text)(2)JMenuItem(Icon icon):构造带指定图标的菜单项。(3)J
15、MenuItem(String text,Icon icon)(4)JMenuItem(String text,int mnemonic):构造带文本和助记符的菜单项。菜单项与菜单一样,可以指定键盘助记符。菜单项还可设置键盘快捷键,通常以“Ctrl+按键”形式执行。(5)void setAccelerator(KeyStroke keyStroke):设置加速器(快捷键),运行时不必显示菜单的层次结构,能直接执行菜单项。参数是键击类KeyStroke,该类只能使用静态方法getKeyStroke产生对象。如:menuItemFileExit.setAccelerator(KeyStroke.g
16、etKeyStroke(KeyEvent.VK_E,KeyEvent.CTRL_DOWN_MASK,true);KeyStroke类的getKeyStroke方法有3个参数,第一个表示X键,第二个表示Ctrl键,第三个参数true表示按键释放的情况下执行。6)void addActionListener(ActionListener llstener):添加动作事件监听器。17.4 JPopupMenu弹出菜单 弹出菜单(快捷菜单):也由多个 菜单项组成。弹出菜单与组件密切相关,不同组件弹出菜单一般相同。弹出菜单必须编写鼠标事件代码。要执行菜单项操作,还有添加菜单项的动作事件监听器。【例17-
17、3】在例17-2程序基础上,增加文本区的弹出菜单。class Frame3 extends Frame2 /继承例17-2的Frame2JPopupMenu popupMenu=new JPopupMenu();JMenuItem popupMenuItemCut=new JMenuItem(剪切);JMenuItem popupMenuItemCopy=new JMenuItem(复制);JMenuItem popupMenuItemPaste=new JMenuItem(粘贴);public Frame3()this.setTitle(增加了弹出菜单);initialize();this.
18、setVisible(true);private void initialize()popupMenu.add(popupMenuItemCut);popupMenu.add(popupMenuItemCopy);popupMenu.add(popupMenuItemPaste);/文本区添加鼠标事件监听器:textArea.addMouseListener(new MouseAdapter()public void mouseReleased(MouseEvent e)if(e.isPopupTrigger()popupMenu.show(textArea,e.getX(),e.getY()
19、;);JPopupMenu常用方法(1)JPopupMenu()(2)JMenuItem add(JMenuItem menuItem)(3)void insert(Component component,int index)(4)void addSeparator()(5)void remove(int pos):移除指定索引位置的组件。(6)void show(Component invoker,int x,int y):在组件调用者的坐标空间中显示弹出菜单。如:popupMenu.show(textArea,e.getX(),e.getY();其中e为鼠标事件对象,e.getX()、e.
20、getY()方法返回鼠标事件的x、y坐标。注:无论下拉菜单还是弹出菜单,均允许出现多层(多级)菜单。17.5 简易记事本【例17-4】在例17-3程序基础上,编写菜单项和工具栏按钮的动作事件处理代码,完成简易记事本的功能。import javax.swing.*;import java.awt.event.*;import java.io.*;import javax.swing.filechooser.FileNameExtensionFilter;class Frame4 extends Frame3 /继承例17-3的Frame3JFileChooser fileChooser=new
21、JFileChooser();FileNameExtensionFilter fileFilter=new FileNameExtensionFilter(文本文件,txt);/文件扩展名过滤器File file;public Frame4()this.setTitle(简易记事本);this.setBounds(100,200,350,300);initialize();this.setVisible(true);private void initialize()/工具栏按钮添加动作事件监听(处理)器:buttonCut.addActionListener(new ActionHandler
22、();buttonCopy.addActionListener(new ActionHandler();buttonPaste.addActionListener(new ActionHandler();/菜单项添加动作事件监听(处理)器:menuItemFileNew.addActionListener(new ActionHandler();menuItemFileOpen.addActionListener();/弹出菜单项添加动作事件监听(处理)器:popupMenuItemCut.addActionListener(new ActionHandler();popupMenuItemC
23、opy.addActionListener();popupMenuItemPaste.addActionListener();fileChooser.setFileFilter(fileFilter);/文件对话框扩展名过滤/菜单项和按钮的动作事件监听处理类(内部类):class ActionHandler implements ActionListener public void actionPerformed(ActionEvent e)if(e.getSource()=buttonCut|e.getSource()=menuItemEditCut|e.getSource()=popupM
24、enuItemCut)textArea.cut();else if(e.getSource()=buttonCopy|)textArea.copy();else if(e.getSource()=menuItemFileNew)newFile();/调用新建文件方法 else if(e.getSource()=menuItemFileOpen)openFile();/调用打开文件方法 else if(e.getSource()=menuItemFileSaveAs)saveAsFile();/调用保存文件方法 else if(e.getSource()=checkBoxMenuItemEdit
25、AutoWrap)if(checkBoxMenuItemEditAutoWrap.isSelected()textArea.setLineWrap(true);/设置文本区自动换行 else textArea.setLineWrap(false);/取消文本区自动换行 else if(e.getSource()=menuItemHelpAbout)JOptionPane.showMessageDialog(null,“程序设计);void newFile()/新建文件方法if(!textArea.getText().equals()saveFile();/调用保存文件方法textArea.se
26、tText(null);/清空文本区file=null;this.setTitle(简易记事本);void openFile()/打开文件方法 if(!textArea.getText().equals()saveFile();/调用保存文件方法 int returnVal=fileChooser.showOpenDialog(this);if(returnVal=JFileChooser.APPROVE_OPTION)file=fileChooser.getSelectedFile();try FileReader fileReader=new FileReader(file);textAr
27、ea.read(fileReader,null);this.setTitle(file.getName()+简易记事本);fileReader.close();/关闭流 catch(IOException e)JOptionPane.showMessageDialog(this,异常:“);void saveFile()/保存文件方法 if(file!=null&file.exists()/若文件已打开(存在)try FileWriter fileWriter=new FileWriter(file);textArea.write(fileWriter);fileWriter.close();
28、/关闭流catch(IOException e)JOptionPane.showMessageDialog(this,异常:“);else saveAsFile();/调用另存为文件方法 void saveAsFile()/另存为文件方法 int returnVal=fileChooser.showSaveDialog(this);if(returnVal=JFileChooser.APPROVE_OPTION)file=fileChooser.getSelectedFile();try FileWriter fileWriter=new FileWriter(file);textArea.w
29、rite(fileWriter);this.setTitle(file.getName()+简易记事本);fileWriter.close();catch(IOException e)JOptionPane.showMessageDialog(this,异常:“);public class Example4 /主类public static void main(String args)new Frame4();17.6 本章小结 工具栏是条状的容器,上面放置按钮等组件。工具栏一般放置在窗框(窗口)上部、菜单栏之下。菜单分为主菜单和弹出菜单。主菜单就是菜单栏,上面放置若干个菜单(JMenu对象)
30、。菜单中又放置若干个菜单项(菜单命令),运行时单击菜单,会出现下拉菜单项列表,因此也称下拉菜单。弹出菜单又叫快捷菜单,是在组件上面按下再释放鼠标所弹出的菜单,因此与组件和鼠标操作关联。弹出菜单中也要放置若干个菜单项。不管下拉还是弹出菜单,都包含菜单项。必须编写每个菜单项的事件处理代码(通常是动作事件代码),运行时才能单击菜单项执行相关操作。17.7 实训17:简易记事本(1)编写简易记事本程序。要求使用两个类:一个是主界面窗框类,另一个入口主类。程序功能:在窗框中部的文本区里输入和编辑文本,其中剪切、复制和粘贴文本既可使用编辑菜单,也可使用工具栏按钮和快捷菜单。通过执行菜单,能使用文件对话框打开和保存文件。(2)(选做)在JBuilder开发环境编写简易记事本程序。谢谢!返回目录返回目录 结束放映结束放映