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