学习目标

n          创建菜单

n          菜单中的图标

n          菜单中的复选框和单选按钮

n          弹出菜单

n          快捷键和加速器

n          启用和禁用菜单项

n          JApplet的概念

n          JApplet的安全性

n          JApplet的生命周期


创建菜单

创建菜单是非常简单的。下面代码创建了一个菜单栏:

JMenuBar     menuBar = new JMenuBar();

在框架中添加菜单栏的方法是:

frame.setJMenuBar(menuBar);

对于每个菜单来说,你需要创建一个菜单对象:

JMenu  editMenu = new JMenu("Edit");

然后把此层菜单添加到菜单栏中:

menuBar.add(editMenu);

接着在菜单对象中添加菜单项,分割符以及子菜单:

JMenuItem  pasteItem = new JMenuItem("Paste");

editMenu.add(pasteItem);

editMenu.addSeparator();

JMenu  optionMenu = …;//a submenu

editMenu.add(optionsMenu);

当用户选择一个菜单时,就会触发一个动作事件。你需要为每一个菜单项安

装一个动作监听器。

pasteItem.addActionListener(newActionListener(){………});

add方法返回创建的子菜单项,因此你可以捕获它的返回值并为其添加监听

器,如下所示:

JMenuItempasteItem = editMenu.add("Paste");

//JMenuItempasteItem = new JMenuItem("Paste");

//editMenu.add(pasteItem);

pasteItem.addActionListener(…………….);

菜单中的图标

菜单项同按钮非常相似。事实上,JMenuItem类继承了AbstractButton

类。

同按钮一样,菜单也可以具有文本标签,图标或者二者都有。你可以通过

JMenuItem(String  s,Icon i)或者JMenuItem(Icon i)构造器来

为菜单指定一个图标,或者通过JMenuItem类中的setIcon方法(继承自

AbstractButton类)来设定图标。例如,

JMenuItemcutItem=new JMenuItem("Cut",new ImageIcon("cut.gif"));

默认情况下,菜单项中文本显示在图标的右侧。把文本显示在左侧的方法是

调用

JMenuItem类中的setHorizontalTextPosition方法(继承自

AbstractButton)。例如:

cutItem.setHorizontalTextPosition(SwingConstants.LEFT);

这个调用把菜单项文本移到图标的左边。你也可以一个图标添加到一个动作上:

cutAction.putValue(Action.SMALL_ICON,newImageIcon("1.gif"));

当你使用动作来构造一个菜单项时,那么Action.NAME值会变成菜单项的

文本,而Action.SMALL_ICON则成为图标。另外,在AbstractAction

构造器中也可以设定图标

菜单中的复选框和单选按钮

复选框和单选按钮菜单项在文本旁边显示了一个复选框或一个单选按钮。除了按钮装饰以外,你可以像对待其他菜单项一样对待复选框和单选按钮,单选按钮菜单项同常规单选按钮一样。你必须把它们添加到一个按钮组中。当组中的一个按钮被选择后,所有的其他按钮都自动成为未选择项。使用这种菜单项,你不需要立刻得到用户选择菜单项的通知。取而带之的是,使用isSelected方法来测试菜单项的当前状态。事例中有代码。

弹出菜单

弹出菜单是一种不固定在菜单栏中,但是可随处浮动的菜单。创建弹出菜单的方式同创建常规菜单非常相似,但是弹出菜单没有标题。

JPopupMenupopup=new JPopupMenu();

接着用常规方法添加菜单项:

JMenuItemitem=new JMenuItem("Cut");

item.addActionListener(listener);

popup.add(item);

弹出菜单并不像常规菜单栏那样总是显示在框架的顶部,你必须明确调用

show方法来显示它们。你需要指定它的父组件和位置。如:

popup.show(panel,x,y);

通常当用户点击某个鼠标键时,弹出菜单就会出现,这就是所谓的弹出触发

器。在Windows中,弹出出发器通常是鼠标右键。下面是用户点击弹出触发

器弹出菜单的步骤:

安装一个鼠标监听器。

在鼠标监听器中添加如下代码:

publicvoid mousePressed(MouseEvent e)

{

   if(e.isPopupTrigger())

      popup.show(e.getComponent(),e.getX(),e.getY());

}

当用户点击弹出触发器时,这段代码就会在鼠标位置处显示弹出菜单。

快捷键和加速器

对于有经验的用户来说,通过快捷键来选择菜单项要方便的多。在JAVA中,你可以通过在菜单项构造器中指定一个快捷字母来为菜单项设置快捷键,如:

JMenuItemitem=new JMenuItem("Cut",'t');

有时候,你不想在菜单项的第一个匹配快捷键的字母下面画下划线。比如,如果你在菜单项"Save As"有一个快捷键"A",那么在第二个"A"(SaveAs)下画下划线可能更有意义。通过调用setDisplayedMneMonicIndex方法。如果你有一个Action对象,那么你可以把快捷键作为       Action.MNEMONIC_KEY的键值添加到该对象中,如:

cutAction.putValue(Action.MNEMONIC_KEY,newIngeger('T'));

你只能在菜单项的构造器中设定快捷键字母,而在菜单的构造器中则不行。若要为一个菜单设置快捷键,你需要调用setMnemonic方法:

JMenuhelpMenu=new JMenu("Help");

helpMenu.setMnemonic('H');

快捷键用来从当前打开的菜单中选择一个子菜单或者菜单项,而加速器是在不打开菜单的情况下选择菜单项快捷键。

openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));

当用户按下加速器组合键时,就会自动选择相应的菜单项,同时激活一个动作事件,这就如同手工选择了该菜单项一样。加速器只能关联到菜单项,而不是菜单。加速器键并不实际打开菜单。它知识直接激活同菜单关联的动作事件而已。

启用和禁用菜单项

有时候,一个特定的菜单项可能只在某些环境中可用。例如:当一个文档以只读方式打开时,Save菜单就没意义了。当然,我们可以使用JMenu.remove方法把此项从菜单中删除,但是这样用户会疑问为什么菜单内容会发生改变。取而代之的是,把此菜单项设为禁用状态会更好。一个禁用的菜单项呈现灰色,并且它不能被选择。启用或禁用菜单项需要使用setEnabled方法:

saveItem.setEnabled(false);

JApplet的概念

JApplet是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类。它是Java技术容器(container)的一种特定类型,其执行方式不同于应用程序。一个应用程序是从它的main()方法被调用开始的,而一个JApplet的生命周期在一定程度上则要复杂得多。本模块分析了JApplet如何运行,如何被装载到浏览器中,以及它是如何编写的。

JApplet的安全性

由于通过网络装载,Applet的代码具有一种内在的危险性。如果有人编写了一个恶意的类来读取你的密码文件,并把它通过Internet传送,会产生怎样的后果呢?

所能够控制的安全程度是在浏览器层次上实现的。大多数浏览器(包括Netscape Nevigator)缺省地禁止以下操作:

n       运行时执行另一程序

n       任何文件的输入/输出

n       调用任何本地方法

n       尝试打开除提供Applet的主机之外的任何系统的Socket

这些限制的关键在于,通过限制Applet对系统文件的存取来阻止它侵犯一个远程系统的隐私或破坏该系统。禁止执行另一程序和不允许调用本地方法限制了Applet启动未经JVM检查的代码。对Socket的限制则禁止了与另一个可能有危害性的程序的通信。

JDK1.2提供了一种方式,它指定了一个特殊的"保护域"或一个特殊Applet运行的安全性环境。远程系统检查原始的URL以及它下载的Applet的签名,和一个含有从特殊的Applet到特殊保护域的映射入口的本地文件进行比较。因此,来自特别位置的特殊Applet具有一些运行特权。

JApplet的生命周期

当运行JApplet的时候有如下生命周期:

n       创建JApplet实例,调用该JApplet的默认的构造方法

n       实例化完后,紧接着调用init()方法进行初始化操作

n       初始化完后,紧接着调用start()方法,开始执行

n       由于JApplet类也是Panel类的子类,所以也会调用paint()方法

n       当浏览器最小化的时候调用stop()方法

n       当浏览器显示的时候又会调用start()方法

n       当浏览器关闭的时候调用destroy()方法

由上可知:构造器,init()方法,destroy()方法只执行一次                         而,start(),paint(),stop()方法执行多次


实例分析

例1

问题的描述:

菜单的综合使用

解决方案:

请看下例:

packagecom.menu;

 

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjava.awt.event.InputEvent;

importjava.awt.event.KeyEvent;

importjava.awt.event.MouseAdapter;

importjava.awt.event.MouseEvent;

 

importjavax.swing.AbstractAction;

importjavax.swing.Action;

importjavax.swing.ButtonGroup;

importjavax.swing.ImageIcon;

importjavax.swing.JCheckBoxMenuItem;

importjavax.swing.JFrame;

importjavax.swing.JMenu;

importjavax.swing.JMenuBar;

importjavax.swing.JMenuItem;

importjavax.swing.JPopupMenu;

importjavax.swing.JRadioButtonMenuItem;

importjavax.swing.KeyStroke;

 

public class TestMenu {

   public static void main(String[]args) {

      MenuFrameframe = new MenuFrame();

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      frame.setVisible(true);

   }

};

 

classMenuFrame extends JFrame {

   // ActionActionListener的子接口

   private Action saveAction;

 

   private Action saveAsAction;

 

   // 菜单中的复选框

   private JCheckBoxMenuItem readonlyItem;

 

   // 弹出菜单

   private JPopupMenu popup;

 

   public MenuFrame() {

      setTitle("MenuTest");

      setSize(400,300);

      // 创建一个File菜单

      JMenu fileMenu= new JMenu("File");

 

      // File菜单加菜单项NewOpen

      JMenuItemnewItem = fileMenu.add(new TestAction("New"));

      JMenuItemopenItem = fileMenu.add(new TestAction("Open"));

      // Open菜单项加加速器

      openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,

            InputEvent.CTRL_MASK));

      fileMenu.addSeparator();

 

      // 创建动作按钮

      saveAction = new TestAction("Save");

      // 加并创建菜单项

      JMenuItemsaveItem = fileMenu.add(saveAction);

      // 给菜单项加加速器

      saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,

            InputEvent.CTRL_MASK));

 

      // 同上

      saveAsAction = new TestAction("Save AS");

      JMenuItemsavaAsItem = fileMenu.add(saveAsAction);

      // 给菜单加分割线

      fileMenu.addSeparator();

      // 通过匿名对象的形式给菜单加菜单项

      fileMenu.add(new AbstractAction("Exit"){

         public void actionPerformed(ActionEvent event) {

            System.exit(0);

         }

      });

      // 创建菜单形式的复选框

      readonlyItem = new JCheckBoxMenuItem("Read-only");

      // 给菜单复选框加动作监听器

      readonlyItem.addActionListener(newActionListener() {

         public void actionPerformed(ActionEvent event) {

            boolean saveOk = !readonlyItem.isSelected();

            saveAction.setEnabled(saveOk);

            saveAsAction.setEnabled(saveOk);

         }

      });

      // 创建按钮组:给菜单单选按钮加

      ButtonGroupgroup = new ButtonGroup();

      // 创建菜单单选按钮

      JRadioButtonMenuIteminsertItem = new JRadioButtonMenuItem("Insert");

      insertItem.setSelected(true);

      JRadioButtonMenuItemovertypeItem = new JRadioButtonMenuItem("Overtype");

      // 把菜单单选按钮放到一个按钮组里

      group.add(insertItem);

      group.add(overtypeItem);

 

      // 创建三个带图标的菜单项

      ActioncutAction = new TestAction("Cut");

      cutAction.putValue(Action.SMALL_ICON, new ImageIcon("01.gif"));

      ActioncopyAction = new TestAction("Copy");

      copyAction.putValue(Action.SMALL_ICON, new ImageIcon("02.gif"));

      ActionpasteAction = new TestAction("Paste");

      pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("03.gif"));

 

      // 创建菜单

      JMenu editMenu= new JMenu("Edit");

      // 给菜单加菜单项

      editMenu.add(cutAction);

      editMenu.add(copyAction);

      editMenu.add(pasteAction);

 

      // 创建菜单

      JMenuoptionMenu = new JMenu("Options");

      // 给菜单加菜单项

      optionMenu.add(readonlyItem);

      // 给菜单的菜单项之间加分隔线

      optionMenu.addSeparator();

      optionMenu.add(insertItem);

      optionMenu.add(overtypeItem);

 

      editMenu.addSeparator();

      // 给菜单加带有子菜单的菜单项

      editMenu.add(optionMenu);

 

      JMenu helpMenu= new JMenu("Help");

      // 给菜单设置快捷键

      helpMenu.setMnemonic('H');

 

      JMenuItemindexItem = new JMenuItem("Index");

      // 给菜单项设置快捷键

      indexItem.setMnemonic('I');

      helpMenu.add(indexItem);

 

      ActionaboutAction = new TestAction("About");

      aboutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));

      helpMenu.add(aboutAction);

 

      // 创建菜单栏

      JMenuBarmenuBar = new JMenuBar();

      // 给框架设置菜单栏

      setJMenuBar(menuBar);

 

      // 给菜单栏加菜单

      menuBar.add(fileMenu);

      menuBar.add(editMenu);

      menuBar.add(helpMenu);

 

      // 创建弹出菜单

      popup = new JPopupMenu();

      // 给弹出菜单加菜单项

      popup.add(cutAction);

      popup.add(copyAction);

      popup.add(pasteAction);

 

      // 给面板加鼠标右键监听器

      getContentPane().addMouseListener(new MouseAdapter() {

         // 鼠标点击(松开),触发下面方法的执行

         public void mouseReleased(MouseEvent e) {

            // 如果是弹出菜单(右键点击时)

            if (e.isPopupTrigger())

                popup.show(e.getComponent(), e.getX(), e.getY());

         }

      }// end new MouseAdapter()构造器

            );// end addMouseListener()方法

   }// end public MenuFrame()构造器

};//end class MenuFrame

 

// 该类不仅可以创建动作按钮,也可以实现动作监听器

classTestAction extends AbstractAction {

   // 实例化按钮,并给定名字

   public TestAction(String name) {

      super(name);

   }

 

   // 动作产生时,实现的功能

   public void actionPerformed(ActionEvent e) {

      // 在控制台打印哪个按钮被选择了

      System.out.println(getValue(Action.NAME)+ " selected.");

   }

}

编译,运行以及输出的结果为:

   (如图1所示)


例2

问题的描述:

创建一个 JApplet,并测试生命周期

解决方案:

请看下例:

JApplet代码:

packagecom.applet;

 

import java.awt.Color;

importjava.awt.Graphics;

 

importjavax.swing.JApplet;

 

//JApplet类是Pannel的子类,所以具有Panel的功能,可以当Pannel使用

public class MyJApplet extends JApplet {

   // 通过默认的构造器来实例化一个Applet

   public MyJApplet() {

      super();

      System.out.println("MyJApplet()");

   }

 

   // 当运行该Applet的网页关闭的时候,调用下面的方法

   public void destroy() {

      System.out.println("destroy()");

      // Put your code here

   }

 

   // 实例化完该Applet,会紧接着调用init()方法进行初始化

   public void init() {

      // Put your code here

      System.out.println("init()");

      this.setBackground(Color.GREEN);

   }

 

   // 在初始化该Applet的时候调用该方法

   public void paint(Graphics g) {

      System.out.println("paint(Graphics)");

      g.setColor(Color.RED);

      g.drawString("hello word", 100, 100);

   }

 

   // 在初始化完Applet,调用下面的方法,可以调用多次,在浏览器显示的时候调用

   public void start() {

      System.out.println("start()");

      // Put your code here

   }

 

   // 在浏览器最小化的时候,调用该方法

   public void stop() {

      System.out.println("stop()");

      // Put your code here

   }

 

}

相应的html代码:

<html>

    <head>

       //在浏览器标题

       <title>My applet 'MyJApplet' starting page</title>

 

    </head>

 

    <body>

 

       <applet codebase="." code="com.applet.MyJApplet.class"

           name="MyJApplet"width="320"height="240">

       </applet>

    </body>

</html>

运行的结果如图2:


内容总结

n       菜单的创建和使用

n       JApplet的创建和使用


独立实践

n       做一个双应用程序:即可以当作应用程序(在框架上加菜单)运行,也可以当作小应用程序运行。

 

posted on 2016-10-08 12:13  波波嘟  阅读(1219)  评论(0编辑  收藏  举报