swing components-会话框ToolTip

swing components-会话框ToolTip

效果:
一、
AzEllipseToolTip1.gif
二、
AzPolygonToolTip.gif

代码:
一、
package  azure.ui.swing.components.tooltip;

import  java.awt.AlphaComposite;
import  java.awt.Color;
import  java.awt.FlowLayout;
import  java.awt.Graphics;
import  java.awt.Graphics2D;
import  java.awt.Point;
import  java.awt.RenderingHints;
import  java.awt.event.MouseEvent;
import  java.awt.event.MouseListener;
import  java.awt.geom.Area;
import  java.awt.geom.Ellipse2D;

import  javax.swing.JButton;
import  javax.swing.JFrame;
import  javax.swing.JLayeredPane;
import  javax.swing.JPanel;
import  javax.swing.SwingUtilities;

/**
 * 
@author  Azure
 * 
@version  1.0 14/03/07
 
*/
public   class  AzEllipseToolTipExample  extends  JFrame {
    
public  AzEllipseToolTipExample() {
        init();
    }

    
public   void  init() {
        HalfOpaqueToolTip tooltip 
=   new  HalfOpaqueToolTip( " 让我再吻一吻你的脸! " ,
                
new  Color( 250 250 200 ), Color.RED,  new  Color( 95 145 145 ),
                
this );
        JButton button 
=   new  JButton( " swing " );
        button.addMouseListener(tooltip);

        
this .setLayout( new  FlowLayout());
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add(button);
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));

        
this .setSize( 380 200 );
        
this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
this .setLocationRelativeTo( null );
        
this .setVisible( true );
    }

    
public   static   void  main(String args[]) {
        
new  AzEllipseToolTipExample();
    }

    
class  HalfOpaqueToolTip  extends  JPanel  implements  MouseListener {
        
private  Color backGroundCol  =   null ;

        
private  Color foregroundColorCol  =   null ;

        
private  Color borderCol  =   null ;

        
private  String content  =   null ;

        
private  JFrame frame  =   null ;

        
private   int  contentEllipseX  =   30 ;

        
private   int  contentEllipseY  =   20 ;

        
private   int  contentEllipseW  =   0 ;

        
private   int  contentEllipseH  =   0 ;

        
private   int  LEFT  =   1 ;

        
private   int  RIGHT  =   2 ;

        
private   int  direction  =   2 ;

        
public  HalfOpaqueToolTip(String tooltipContent, Color backGroundColor,
                Color foregroundColor, Color borderColor, JFrame frame) {
            content 
=  tooltipContent;
            backGroundCol 
=  backGroundColor;
            foregroundColorCol 
=  foregroundColor;
            borderCol 
=  borderColor;
            
/*
             * 调整tooltip的大小
             
*/
            content 
=  tooltipContent;
            contentEllipseW 
=  tooltipContent.getBytes().length  *   6   +   10 ;
            contentEllipseH 
=   40 ;
            
this .setSize(contentEllipseX  +  contentEllipseW  +   1 90 );

            
this .setOpaque( false );
            
this .setVisible( false );
            
//  将本控件置于界面的最顶层
            frame.getLayeredPane().add( this , JLayeredPane.POPUP_LAYER);
            
this .frame  =  frame;
        }

        
protected   void  paintComponent(Graphics g) {
            
super .paintComponent(g);

            Graphics2D g2d 
=  (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(backGroundCol);
            AlphaComposite composite 
=  AlphaComposite.getInstance(
                    AlphaComposite.SRC_OVER, 
70   /   100.0F );
            g2d.setComposite(composite);
            g2d.fill(getArea());
            
//  恢复到默认情况
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_OFF);

            g2d.setColor(foregroundColorCol);
            
if  (direction  ==  LEFT) {
                g2d.drawString(content, (
int this .getSize().getWidth()
                        
-  contentEllipseX  -  contentEllipseW  +   10 ,
                        contentEllipseY 
+  contentEllipseH  /   2   +   5 );
            } 
else  {
                g2d.drawString(content, contentEllipseX 
+   10 , contentEllipseY
                        
+  contentEllipseH  /   2   +   5 );
            }
        }

        
protected   void  paintBorder(Graphics g) {
            
super .paintBorder(g);
            Graphics2D g2d 
=  (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(borderCol);
            g2d.draw(getArea());
        }

        
private  Area getArea() {
            
if  (direction  ==  LEFT) {
                
return  getLeftArea();
            } 
else  {
                
return  getRightArea();
            }
        }

        
private  Area getLeftArea() {
            Area area 
=   new  Area( new  Ellipse2D.Float(( int this .getSize()
                    .getWidth() 
-   6   -   1 , ( int this .getSize().getHeight()  -   20 ,
                    
6 6 ));
            area.add(
new  Area( new  Ellipse2D.Float(( int this .getSize()
                    .getWidth() 
-   10   -   30   +   1 ,
                    (
int this .getSize().getHeight()  -   35 30 15 )));
            area.add(
new  Area( new  Ellipse2D.Float(( int this .getSize()
                    .getWidth()
                    
-  contentEllipseX  -  contentEllipseW  +   1 , contentEllipseY,
                    contentEllipseW, contentEllipseH)));
            
return  area;
        }

        
private  Area getRightArea() {
            Area area 
=   new  Area( new  Ellipse2D.Float( 0 , ( int this .getSize()
                    .getHeight() 
-   20 6 6 ));
            area.add(
new  Area( new  Ellipse2D.Float( 10 , ( int this .getSize()
                    .getHeight() 
-   35 30 15 )));
            area.add(
new  Area( new  Ellipse2D.Float(contentEllipseX,
                    contentEllipseY, contentEllipseW, contentEllipseH)));

            
return  area;
        }

        
public   void  mouseEntered(MouseEvent e) {
            Point p 
=  e.getLocationOnScreen();
            SwingUtilities.convertPointFromScreen(p, e.getComponent()
                    .getParent());
            
if  (p.x  +   this .getWidth()  >  frame.getX()) {
                direction 
=  LEFT;
                
this .setLocation( new  Point(p.x  -   this .getWidth(), p.y
                        
-   this .getHeight()));
            } 
else  {
                direction 
=  RIGHT;
                
this .setLocation( new  Point(p.x, p.y  -   this .getHeight()));
            }
            
this .setVisible( true );
        }

        
public   void  mouseExited(MouseEvent e) {
            
this .setVisible( false );
        }

        
public   void  mouseClicked(MouseEvent e) {

        }

        
public   void  mousePressed(MouseEvent e) {

        }

        
public   void  mouseReleased(MouseEvent e) {

        }

    }
}


二、
package  azure.ui.swing.components.tooltip;

import  java.awt.AlphaComposite;
import  java.awt.Color;
import  java.awt.FlowLayout;
import  java.awt.Graphics;
import  java.awt.Graphics2D;
import  java.awt.Point;
import  java.awt.Polygon;
import  java.awt.RenderingHints;
import  java.awt.event.MouseEvent;
import  java.awt.event.MouseListener;
import  java.awt.geom.Area;
import  java.awt.geom.RoundRectangle2D;
import  java.util.StringTokenizer;

import  javax.swing.JButton;
import  javax.swing.JFrame;
import  javax.swing.JLayeredPane;
import  javax.swing.JPanel;
import  javax.swing.SwingUtilities;

/**
 * 
@author  Azure
 * 
@version  1.0 14/03/07
 
*/
public   class  AzPolygonToolTipExample  extends  JFrame {
    
public  AzPolygonToolTipExample() {
        init();
    }

    
public   void  init() {
        HalfOpaqueToolTip tooltip 
=   new  HalfOpaqueToolTip(
                
" 让我再吻一吻你的脸! " new  Color( 250 250 200 ),
                Color.RED, 
new  Color( 95 145 145 ),  this );
        JButton button 
=   new  JButton( " swing " );
        button.addMouseListener(tooltip);

        
this .setLayout( new  FlowLayout());
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add( new  JButton( " " ));
        
this .add(button);

        
this .setSize( 380 200 );
        
this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
this .setLocationRelativeTo( null );
        
this .setVisible( true );
    }

    
public   static   void  main(String args[]) {
        
new  AzPolygonToolTipExample();
    }

    
class  HalfOpaqueToolTip  extends  JPanel  implements  MouseListener {
        
private  Color backGroundCol  =   null ;

        
private  Color foregroundColorCol  =   null ;

        
private  Color borderCol  =   null ;

        
private  String content  =   null ;

        
private  JFrame frame  =   null ;

        
private   int  LEFT  =   1 ;

        
private   int  RIGHT  =   2 ;

        
private   int  direction  =   2 ;

        
public  HalfOpaqueToolTip(String tooltipContent, Color backGroundColor,
                Color foregroundColor, Color borderColor, JFrame frame) {
            content 
=  tooltipContent;
            backGroundCol 
=  backGroundColor;
            foregroundColorCol 
=  foregroundColor;
            borderCol 
=  borderColor;
            
/*
             * 调整tooltip的大小
             
*/
            
int  fristRowIndex  =  tooltipContent.indexOf( " \n " );
            String tooltipStr 
=   "" ;
            
if  (fristRowIndex  >   0 ) {
                tooltipStr 
=  tooltipContent.substring( 0 , tooltipContent
                        .indexOf(
" \n " ));
            } 
else  {
                tooltipStr 
=  tooltipContent;
            }

            
this
                    .setSize(tooltipStr.length() 
*   this .getFont().getSize()
                            
+   20 new  StringTokenizer(tooltipContent,  " \n " )
                            .countTokens() 
*   20   +   20 ); //  左右各留10的空白空间
             this .setOpaque( false );
            
this .setVisible( false );
            
//  将本控件置于界面的最顶层
            frame.getLayeredPane().add( this , JLayeredPane.POPUP_LAYER);
            
this .frame  =  frame;
        }

        
protected   void  paintComponent(Graphics g) {
            
super .paintComponent(g);

            Graphics2D g2d 
=  (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(backGroundCol);
            AlphaComposite composite 
=  AlphaComposite.getInstance(
                    AlphaComposite.SRC_OVER, 
70   /   100.0F );
            g2d.setComposite(composite);
            g2d.fill(getArea());
            g2d.setColor(foregroundColorCol);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_OFF);
            
/*
             * 画上字符内容
             
*/
            StringTokenizer contentTokenizer 
=   new  StringTokenizer(content,
                    
" \n " );
            
int  contentStartY  =   20 ;
            
while  (contentTokenizer.hasMoreElements()) {
                g2d.drawString(contentTokenizer.nextToken(), 
10 , contentStartY);
                contentStartY 
=  contentStartY  +   20 ;
            }

        }

        
protected   void  paintBorder(Graphics g) {
            
super .paintBorder(g);
            Graphics2D g2d 
=  (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(borderCol);
            g2d.draw(getArea());
        }

        
private  Area getArea() {
            
if  (direction  ==  LEFT) {
                
return  getLeftArea();
            } 
else  {
                
return  getRightArea();
            }
        }

        
private  Area getLeftArea() {
            Area area 
=   new  Area( new  RoundRectangle2D.Float( 0 0 this
                    .getWidth() 
-   1 this .getHeight()  -   10 10 10 ));
            Polygon polygon 
=   new  Polygon();
            polygon.addPoint(
this .getWidth()  -   25 this .getHeight()  -   10 );
            polygon.addPoint(
this .getWidth()  -   10 this .getHeight()  -   10 );
            polygon.addPoint(
this .getWidth(),  this .getHeight());
            area.add(
new  Area(polygon));

            
return  area;
        }

        
private  Area getRightArea() {
            Area area 
=   new  Area( new  RoundRectangle2D.Float( 0 0 this
                    .getWidth()
- 1 this .getHeight()  -   10 10 10 ));
            Polygon polygon 
=   new  Polygon();
            polygon.addPoint(
25 this .getHeight()  -   10 );
            polygon.addPoint(
10 this .getHeight()  -   10 );
            polygon.addPoint(
0 this .getHeight());
            area.add(
new  Area(polygon));

            
return  area;
        }

        
public   void  mouseEntered(MouseEvent e) {
            Point p 
=  e.getComponent().getLocationOnScreen();
            SwingUtilities.convertPointFromScreen(p, e.getComponent()
                    .getParent());
            
if  (p.x  +   this .getWidth()  >  frame.getX()) {
                direction 
=  LEFT;
                
this .setLocation( new  Point(p.x  -   this .getWidth()  +   10 , p.y
                        
-   this .getHeight()  +   10 ));
            } 
else  {
                direction 
=  RIGHT;
                
this .setLocation( new  Point(p.x  +  e.getComponent().getWidth(),
                        p.y 
-   this .getHeight()  +   10 ));
            }
            
this .setVisible( true );
        }

        
public   void  mouseExited(MouseEvent e) {
            
this .setVisible( false );
        }

        
public   void  mouseClicked(MouseEvent e) {

        }

        
public   void  mousePressed(MouseEvent e) {

        }

        
public   void  mouseReleased(MouseEvent e) {

        }

    }
}

你可能感兴趣的:(swing components-会话框ToolTip)