Swing的大多数控件都已经实现了setToolTip接口,当鼠标悬停时会显示设置好的提示信息。但是当需要精确地显示复杂的提示信息时就力不从心。本文就介绍利用上下文菜单来显示复杂的提示信息。


     首先需要解决在鼠标悬停时在何地显示提示信息的问题,这可以通过为控件添加MouseMotionListener来实现。通过MouseEvent的Point可以知道当前鼠标悬停的精确地点,再判断相对于控件的位置,从而得出是否需要显示提示信息。

     其次当需要显示提示信息时,需要运用上下文菜单在相对控件的特定位置显示提示信息。 上下文菜单也是一个面板,可以设置布局管理器和添加控件,把所有的提示信息封装到一个JPanel里面,然后把该panel添加到菜单里面即可(BorderLayout居中)。具体代码如下。



    1. table.addMouseMotionListener(new MouseMotionListener() {  
    2. @Override  
    3. public void mouseMoved(MouseEvent e) {  
    4.                     Point point = e.getPoint();  
    5. int rowIndex = table.rowAtPoint(point);  
    6. if (rowIndex > 0) {  
    7. new JPopupMenu();  
    8. new BorderLayout());  
    9.                         JPanel infoPanel = createtInfoPanel();  
    10.                         popup.add(infoPanel, BorderLayout.CENTER);  
    11.   
    12. int)point.getX(), (int)point.getY());  
    13.                     }  
    14.                 }  
    15.   
    16. @Override  
    17. public void mouseDragged(MouseEvent e) {  
    18.   
    19.                 }  
    20.             });


    1. private JPanel createtInfoPanel() {  
    2. new JPanel();  
    3. new MigLayout("", "[grow,fill]", "20[pref!]20");  
    4.             infoPanel.setLayout(layout);  
    5.   
    6. new JLabel("Cool Thing"));  
    7.               
    8. return infoPanel;  
    9.         }



         通过以上方式,可以精确控制只有在特定的某一个位置才显示提示信息,比如某一列,或者某一特殊的单元格。也可以把复杂的提示信息放到面板中进行布局,style和显示。功能强大。




    //新建一个button
    JButton bt = new JButton();
    //添加监听
    bt.addMouseMotionListener(new MouseAdapter(){  
    	       public void mouseMoved(MouseEvent e) {  
    	               bt .setToolTipText("你想要显示的内容");
    	           }  
    	       }  
    	   });



    import javax.swing.JFrame;
    import java.awt.Dimension;
    import javax.swing.JPanel;
    import java.awt.GridBagLayout;
    import javax.swing.JButton;
    import java.awt.Rectangle;
    
    public class HideButton extends JFrame {
    
     private JPanel jPanel = null;
     private JButton jButton = null;
    
     /**
      * This method initializes 
      * 
      */
     public HideButton() {
      super();
      initialize();
     }
    
     /**
      * This method initializes this
      * 
      */
     private void initialize() {
            this.setSize(new Dimension(239, 129));
            this.setContentPane(getJPanel());
      this.setVisible(true);
      this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     }
    
     /**
      * This method initializes jPanel 
      *  
      * @return javax.swing.JPanel 
      */
     private JPanel getJPanel() {
      if (jPanel == null) {
       jPanel = new JPanel();
       jPanel.setLayout(null);
       jPanel.add(getJButton(), null);
      }
      return jPanel;
     }
    
     /**
      * This method initializes jButton 
      *  
      * @return javax.swing.JButton 
      */
     private JButton getJButton() {
      if (jButton == null) {
       jButton = new JButton();
       jButton.setBounds(new Rectangle(72, 29, 109, 39));
       jButton.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseEntered(java.awt.event.MouseEvent e) {
         jButton.setVisible(false);
        }
    public void mouseExited(java.awt.event.MouseEvent e) {    
         jButton.setVisible(true);
        }
       });
      }
      return jButton;
     }
     public static void main(String args[]){
      new HideButton().setVisible(true);
     }
    }





         首先需要解决在鼠标悬停时在何地显示提示信息的问题,这可以通过为控件添加MouseMotionListener来实现。通过MouseEvent的Point可以知道当前鼠标悬停的精确地点,再判断相对于控件的位置,从而得出是否需要显示提示信息。

         其次当需要显示提示信息时,需要运用上下文菜单在相对控件的特定位置显示提示信息。 上下文菜单也是一个面板,可以设置布局管理器和添加控件,把所有的提示信息封装到一个JPanel里面,然后把该panel添加到菜单里面即可(BorderLayout居中)。具体代码如下。





      1. table.addMouseMotionListener(new MouseMotionListener() {  
      2. @Override  
      3. public void mouseMoved(MouseEvent e) {  
      4.                     Point point = e.getPoint();  
      5. int rowIndex = table.rowAtPoint(point);  
      6. if (rowIndex > 0) {  
      7. new JPopupMenu();  
      8. new BorderLayout());  
      9.                         JPanel infoPanel = createtInfoPanel();  
      10.                         popup.add(infoPanel, BorderLayout.CENTER);  
      11.   
      12. int)point.getX(), (int)point.getY());  
      13.                     }  
      14.                 }  
      15.   
      16. @Override  
      17. public void mouseDragged(MouseEvent e) {  
      18.   
      19.                 }  
      20.             });




        1. private JPanel createtInfoPanel() {  
        2. new JPanel();  
        3. new MigLayout("", "[grow,fill]", "20[pref!]20");  
        4.             infoPanel.setLayout(layout);  
        5.   
        6. new JLabel("Cool Thing"));  
        7.               
        8. return infoPanel;  
        9.         }




             通过以上方式,可以精确控制只有在特定的某一个位置才显示提示信息,比如某一列,或者某一特殊的单元格。也可以把复杂的提示信息放到面板中进行布局,style和显示。功能强大。




        //新建一个button
        JButton bt = new JButton();
        //添加监听
        bt.addMouseMotionListener(new MouseAdapter(){  
        	       public void mouseMoved(MouseEvent e) {  
        	               bt .setToolTipText("你想要显示的内容");
        	           }  
        	       }  
        	   });



        import javax.swing.JFrame;
        import java.awt.Dimension;
        import javax.swing.JPanel;
        import java.awt.GridBagLayout;
        import javax.swing.JButton;
        import java.awt.Rectangle;
        
        public class HideButton extends JFrame {
        
         private JPanel jPanel = null;
         private JButton jButton = null;
        
         /**
          * This method initializes 
          * 
          */
         public HideButton() {
          super();
          initialize();
         }
        
         /**
          * This method initializes this
          * 
          */
         private void initialize() {
                this.setSize(new Dimension(239, 129));
                this.setContentPane(getJPanel());
          this.setVisible(true);
          this.setDefaultCloseOperation(EXIT_ON_CLOSE);
         }
        
         /**
          * This method initializes jPanel 
          *  
          * @return javax.swing.JPanel 
          */
         private JPanel getJPanel() {
          if (jPanel == null) {
           jPanel = new JPanel();
           jPanel.setLayout(null);
           jPanel.add(getJButton(), null);
          }
          return jPanel;
         }
        
         /**
          * This method initializes jButton 
          *  
          * @return javax.swing.JButton 
          */
         private JButton getJButton() {
          if (jButton == null) {
           jButton = new JButton();
           jButton.setBounds(new Rectangle(72, 29, 109, 39));
           jButton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent e) {
             jButton.setVisible(false);
            }
        public void mouseExited(java.awt.event.MouseEvent e) {    
             jButton.setVisible(true);
            }
           });
          }
          return jButton;
         }
         public static void main(String args[]){
          new HideButton().setVisible(true);
         }
        }