/*本方法建立inner class PopupPanel,这个类继承JPanel并实现MouseListener,PopupMenuListener,ActionListener和
      *ActionListener等3个Listener。MouseListener为处理鼠标事件的Listener,PopupMenuListener为Popup菜单事件的Listener,
      *ActionListener则是大家最熟悉用来处理JMenuItem事件的Listener。
      */
      class PopupPanel extends JPanel implements MouseListener,PopupMenuListener,ActionListener{
        public PopupPanel(){
          Popup=new JPopupMenu();//new一个新的JPopupMenu
          
          JMenuItem theItem;
          
          //分别建立四个JMenuItem和其事件处理模式将JMenuItem加入JPopupMenu中
          Popup.add(theItem=new JMenuItem("Cut",new ImageIcon("3.gif")));//建立JMenuItem组件
          theItem.addActionListener(this);//将JMenuItem组件加入事件处理模式
          Popup.add(theItem=new JMenuItem("Copy",new ImageIcon("3.gif")));
          theItem.addActionListener(this);
          Popup.add(theItem=new JMenuItem("Paste",new ImageIcon("3.gif")));
          theItem.addActionListener(this);
          Popup.addSeparator();//在JPopupMenu中加入分隔线,我们在前面提到的JPopupMenu和Menu大致上的
          //性质是一样的,所以在JPopupMenu中一样是以JMenuItem来当作选项的组件
          Popup.add(theItem=new JMenuItem("Page Setup..."));
          theItem.addActionListener(this);
          
          //利用setBorder()方法将BevelBorder类当作参数传入,使用JPopupMenu产生立体边框浮起的效果,我们
          //也可以将参数设置改为BevelBorder.LOWERED使得JPopupMenu产生立体边框凹陷的效果。
          Popup.setBorder(new BevelBorder(BevelBorder.RAISED));
          
          Popup.addPopupMenuListener(this);//将JPopupMenu组件加入PopupMenu事件处理模式中
          addMouseListener(this);//将PopupPanel类加入Mouse事件处理模式中
          theArea.addMouseListener(this);//后面有说明
        }//end of PopupPanel()
        
        /*由于PopupPanel这个inner class中实现了MouseListener,因此需要覆写mouseClicked(),mousePressed(),
        *mouseRelesed(),mouseEntered()和mouseExited()等5个方法,在这个范例里当mouseClicked(),mousePressed()
        *和mouseReleased()等3个方法被触发时会调用checkPopup()方法来判断是否要将PopupMenu输出来。
        */
        public void mouseClicked(MouseEvent me){
          checkPopup(me);
        }
        
        public void mousePressed(MouseEvent me){
          checkPopup(me);
        }
        
        public void mouseReleased(MouseEvent me){
          checkPopup(me);
        }
        
        public void mouseEntered(MouseEvent me){
        }
        
        public void mouseExited(MouseEvent me){
        }
        
        /*checkPopup()方法,其中,在程序中利用isPopupTrigger()方法判断PopupMenu是否已经输出。若没有,则在程序中利用
        *show()方法将PopupMenu输出目前鼠标指针(利用getX()和getY()方法得知)的位置上。
        */
        private void checkPopup(MouseEvent me){
          if(me.isPopupTrigger()){
            Popup.show(me.getComponent(),me.getX(),me.getY());
          }
        }//end of checkPopup()
        
        /*由于PopupPanel这个inner class实现了PopupMenuListener,因此需要覆写popupMenuWillBecomeVisible(),
        *popupMenuWillBecomeInvisible()方法和popupMenuCanceled()等3个方法,在这个范例里当这3个方法被触发
        *后会在JTextArea中加入一个信息。
        */
        public void popupMenuWillBecomeVisible(PopupMenuEvent pme){
          theArea.append("- PopupMenu Visible! -\n");
        }
        
        public void popupMenuWillBecomeInvisible(PopupMenuEvent pme){
          theArea.append("- PopupMenu Invisible! -\n");
        }
        
        public void popupMenuCanceled(PopupMenuEvent pme){
          theArea.append("- PopupMenu Hidden! -\n");
        }
        
        //当某个JMenuItem被触发后会在JTextArea中加入一个信息
        public void actionPerformed(ActionEvent ae){
          theArea.append("+Popup "+ae.getActionCommand()+" performed!\n");
        }
      }//end of inner class PopupPanel
    }//end of class JPopupMenu1
}

解决方案 »

  1.   

    提示什么错误,我拷贝你的代码,在代码开头加了变量定义就能用了,修改如下:class PopupPanel extends JPanel implements MouseListener,PopupMenuListener,ActionListener{      JPopupMenu Popup;
          JTextArea theArea = new JTextArea();      public PopupPanel(){
              Popup=new JPopupMenu();//new一个新的JPopupMenu
              
              JMenuItem theItem;
              ....
              this.add(theArea);      }