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