用Java实现类似QQ弹出的ToolTip框的功能

来源:互联网 发布:如何提高软件质量 编辑:程序博客网 时间:2024/06/06 02:21

  最近准备用java模拟实现QQ功能,遇到的问题真不少,第一个问题就是怎么用java写出像QQ中用鼠标指着你的头像就会出来一个类似ToolTip的框显示你的qq秀和你的昵称账号等信息,在网上找了很久,都没有很如意的现成的实现方案,后经自己吧网上找到的资料进行整合,加工,终于实现了类似QQ那样的弹出框的功能,今特意将代码发放到网络中,希望能给有和我一样的困扰的,爱好java的朋友一些微不足道的帮助,本人也是初学java,涉足不深,难免在编程过程中有这样或那样的错误存在,或者方案不是很好,希望广大网友批评指正,共同进步。 废话不多说了下面是代码:

  一共有三个类:

  ToolTip.java//实现继承JWindow模拟实现JToolTip框(含一个内部类);

   OperateToolTip.java//控制JToolTip的可视与关闭;

   ToolTipFrame.java//用一个简单的Frame演示JToolTip;

  使用注意:

  使用时先建一个项目,如果完全使用我的代码,见一个包名叫coolbaby

  在以我的类名建3个类,分别将代码复制进去就ok了

  注意本例中使用的图片是本地图片,名为test.gif 放在项目根目录下即可;

  好了

  快试试吧!


       ToolTip.java代码

 

import java.awt.BorderLayout;  import java.awt.Color;   import java.awt.Insets;  import javax.swing.BorderFactory;  import javax.swing.Icon;  import javax.swing.JLabel;  import javax.swing.JPanel;  import javax.swing.JTextArea;  import javax.swing.JWindow;  import javax.swing.border.EtchedBorder;  public class ToolTip {  boolean isCanTop = true; // 是否要求至顶(jre1.5以上版本方可执行);  private int xx_Width, yy_Height;//JToolTip提示框的横坐标和纵坐标;  public ToolTip(int xx,int yy) {   this.xx_Width=xx;  this.yy_Height=yy;  isCanTop = true;  try { // 通过调用方法,强制获知是否支持自动窗体置顶;  JWindow.class.getMethod("setAlwaysOnTop",  new Class[] { Boolean.class });  } catch (Exception e) {  isCanTop = false;  }  }  class ToolTipModel extends JWindow {  private static final long serialVersionUID = 1L;  private JLabel showImage_Label = null;//图片载体;  private JTextArea showMessage_Texa = null;//文字载体;  private JPanel inner_Panel=null;//内部JPanel;  private JPanel external_Panel=null;//外部JPanel;  public ToolTipModel() {  initComponents();  }  private void initComponents() {  this.setSize(300, 300);//JToolTip的大小设置(可绝对设置,也可传入参数设置);   this.getContentPane().add(getExternal_Panel());  }  private JPanel getExternal_Panel(){//返回外部JPanel;  if(external_Panel==null){  external_Panel=new JPanel(new BorderLayout(1, 1));  external_Panel.setBackground(new Color(255, 255, 225));  EtchedBorder etchedBorder = (EtchedBorder) BorderFactory  .createEtchedBorder();   external_Panel.setBorder(etchedBorder); // 设定外部面板内容边框为风化效果   external_Panel.add(getInner_Panel());// 加载内部面板  }   return external_Panel;  }  private JPanel getInner_Panel(){//返回内部JPanel;  if(inner_Panel==null){  inner_Panel=new JPanel();  inner_Panel.setLayout(null);  inner_Panel.setBackground(new Color(255, 255, 225));  inner_Panel.add(get_IconLabel(), null);  inner_Panel.add(get_Message(),null);   }   return inner_Panel;  }  private JTextArea get_Message(){  if(showMessage_Texa==null){  showMessage_Texa=new JTextArea();   showMessage_Texa.setBackground(new Color(255, 255, 225));  showMessage_Texa.setMargin(new Insets(4, 4, 4, 4));//设置组件的边框和它的文本之间的空白。  showMessage_Texa.setLineWrap(true);  showMessage_Texa.setWrapStyleWord(true);  showMessage_Texa.setForeground(Color.BLACK);  showMessage_Texa.setBounds(150, 70, 100, 150);  }  return showMessage_Texa;  }  private JLabel get_IconLabel(){  if(showImage_Label==null){  showImage_Label=new JLabel();   showImage_Label.setBounds(10, 10, 140, 225);  }   return showImage_Label;  }  public void animate() {  new OperateToolTip(this,isCanTop,xx_Width,yy_Height);  OperateToolTip.begin();  }  }  public void setToolTip(Icon icon, String msg) {  ToolTipModel single = new ToolTipModel();  if (icon != null) {  single.get_IconLabel().setIcon(icon);  }  single.showMessage_Texa.setText(msg);  single.animate();  }   }


  OperateToolTip.java代码:

  import coolbaby.ToolTip.ToolTipModel;  public class OperateToolTip {//此类负责对JToolTip的显示与关闭进行控制;  private static ToolTipModel toolTipModel;  private static boolean isCanTop;  private static int xx_Width;  private static int yy_Height;  public OperateToolTip(ToolTipModel single, boolean _useTop,int xx,int yy) {  OperateToolTip.toolTipModel = single;  OperateToolTip.isCanTop = _useTop;  OperateToolTip.xx_Width=xx;  OperateToolTip.yy_Height=yy;  }  public static void begin() {  if (isCanTop) {  toolTipModel.setAlwaysOnTop(true);  }  toolTipModel.setLocation(xx_Width, yy_Height);  toolTipModel.setVisible(true);  }  public static void close() {  toolTipModel.setVisible(false);  toolTipModel.dispose();  }  }


ToolTipFrame.java代码:

  import java.awt.Rectangle;  import java.awt.event.MouseAdapter;  import java.awt.event.MouseEvent;  import java.awt.event.MouseMotionAdapter;  import javax.swing.ImageIcon;  import javax.swing.JButton;  import javax.swing.JFrame;  import javax.swing.JPanel;  import javax.swing.SwingUtilities;  public class ToolTipFrame {  private JFrame jFrame = null; // @jve:decl-index=0:visual-constraint="347,57"  private JPanel jContentPane = null;  private JButton jButton = null;  private boolean isDraging = false;  private int xx_Width, yy_Height;  private JButton getJButton() {  if (jButton == null) {  jButton = new JButton();  jButton.setBounds(new Rectangle(8, 57, 382, 72));  jButton.setText("CoolBabY,QQ:,只有交流才能进步http://www.gzqh-edu.com!");  jButton.addMouseListener(new java.awt.event.MouseAdapter() {   public void mouseExited(java.awt.event.MouseEvent e) {   OperateToolTip.close();  }  public void mouseEntered(java.awt.event.MouseEvent e) {   if((jFrame.getLocation().x+jButton.getLocation().x)>(301+jButton.getLocation().x)){  new ToolTip(jFrame.getLocation().x-301,jFrame.getLocation().y+jButton.getLocation().y).setToolTip(new ImageIcon("test.gif"),"“CoolBabY,QQ:,只有交流才能进步。广州软件开发培训博客:http://blog.sina.com.cn/coolbabybing");  }else{  new ToolTip(jFrame.getLocation().x+(int)jFrame.getWidth(),jFrame.getLocation().y+jButton.getLocation().y).setToolTip(new ImageIcon("test.gif"),"CoolBabY,QQ:,只有交流才能进步。博客:http://blog.sina.com.cn/coolbabybing");   }  }  });  }  return jButton;  }  public static void main(String[] args) {  // TODO 自动生成方法存根  SwingUtilities.invokeLater(new Runnable() {  public void run() {  ToolTipFrame application = new ToolTipFrame();  application.getJFrame().setVisible(true);  }  });  }  private JFrame getJFrame() {  if (jFrame == null) {  jFrame = new JFrame();  jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  jFrame.setSize(400, 200);  jFrame.setContentPane(getJContentPane());  jFrame.setTitle("JToolTipDemo");  jFrame.setUndecorated(true);  moveFrame();  }  return jFrame;  }  public void moveFrame() {  jFrame.addMouseListener(new MouseAdapter() {  public void mousePressed(MouseEvent e) {  isDraging = true;  xx_Width = e.getX();  yy_Height = e.getY();  }  public void mouseReleased(MouseEvent e) {  isDraging = false;  }  });  jFrame.addMouseMotionListener(new MouseMotionAdapter() {  public void mouseDragged(MouseEvent e) {  if (isDraging) {  int left = jFrame.getLocation().x;  int top = jFrame.getLocation().y;  jFrame.setLocation(left + e.getX() - xx_Width, top + e.getY()  - yy_Height);  jFrame.repaint();  }  }  });  }  private JPanel getJContentPane() {  if (jContentPane == null) {  jContentPane = new JPanel();  jContentPane.setLayout(null);  jContentPane.add(getJButton(), null);  }  return jContentPane;  }  }


 

原创粉丝点击