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

  最近准备用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;

  }

  }


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值