[color=red]Swing弹出式菜单[/color]
  缺省时,Swing弹出式菜单是轻量组件(注:这是一种简化的说法,但适用于此处的讨论。如果轻量弹出式菜单与重量组件重叠,则弹出式菜单将在该重量组件下面显示。如图2小应用程序所示。
  有些Swing组件使用弹出式菜单。Swing菜单组件就是一种使用弹出式菜单的组件,它在一个菜单被激活时,显示一个弹出式菜单。缺省时,如果一个与某个菜单相关联的弹出式菜单完全处在弹出式菜单所在的窗口吕,则弹出式菜单使用轻量组件。图2-7所示的小应用程序中与File菜单相关联的弹出式菜单是一个轻量组件,所以它在重量组件AWT按钮的下面显示。

例1在重量组件下面显示的轻量弹出式菜单

import javax.swing.*; 

  import java.awt.*; 

  import java.awt.event.*; 


  public class Test extends JApplet { 

   public void init() { 

    Container contentPane = getContentPane(); 

    JMenuBar menubar = new JMenuBar(); 

    JMenu menu = new JMenu("File"); 


    menu.add("New ..."); 

    menu.add("Open ..."); 

    menu.add("Save As ..."); 

    menu.add("Save"); 

    menu.add("Exit"); 


    contentPane.setLayout(new FlowLayout(FlowLayout.LEFT)); 

    contentPane.add(new Button("An AWT Button ............")); 


    menubar.add(menu); 

    setJMenuBar(menubar); 

   } 

  }



  这个小应用程序创建了一个菜单条、一个AWT按钮和一个菜单。把菜单项添加到菜单中,再把菜单添加到菜单条中,按钮则被添加到小应用程序的内容窗格中。最后,调用JApplet.setJMenuBar(),把菜单条添加到小应用程序中。
  幸运的是,Swing提供了一个机制,它迫使弹出式菜单是重量组件,这样,它们就不会在重量组件下面弹出来。JPopupMenu类提供了一个static方法,该方法可决定弹出式菜单是重量的还是轻量的(注:某些弹出式菜单即可以指定为轻量的,也可以指定为重量的。)
  JPopupMenu.setDefaultLightWeightPopupEnabled()以一个boolean值为参数,这个值指出是把弹出式菜单实例化为轻量的还是把弹出式菜单实例化为重量的,调用setDefaultLightWeightPopupEnabled()时,如果这个boolean值为true,则创建的弹出式菜单是轻量的,如果这个boolean值为false,则创建的弹出式菜单是重量的(注:这也是简化的说法,但同样适用于这里的讨论)。
  图2所示的小应用程序除了在菜单条被实例化之前调用了JPopupMenu.setDefaultLightWeightPopupEnabled(false)以外,其余部分都与图1所示的小应用程序相同。

例2 使用重量弹出式菜单

 

import javax.swing.*; 

  import java.awt.*; 

  import java.awt.event.*; 


  public class Test extends JApplet { 

   public void init() { 

    JPopupMenu.setDefaultLightWeightPopupEnabled(false); 


    Container contentPane = getContentPane(); 

    JMenuBar menubar = new JMenuBar(); 

    JMenu menu = new JMenu("File"); 


    menu.add("New ..."); 

    menu.add("Open ..."); 

    menu.add("Save As ..."); 

    menu.add("Save"); 

    menu.add("Exit"); 


    contentPane.setLayout(new FlowLayout(FlowLayout.LEFT)); 

    contentPane.add(new Button("An AWT Button ............")); 


    menubar.add(menu); 

    setJMenuBar(menubar); 

   } 

  }