一个用Swing实现的java气泡提示效果。

运行效果如下图:

package org.loon.swing.display;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Font;

import java.awt.GraphicsEnvironment;

import java.awt.Insets;

import java.awt.Rectangle;

import javax.swing.BorderFactory;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextArea;

import javax.swing.JWindow;

import javax.swing.border.EtchedBorder;

public class ToolTip {

// 气泡提示宽

private int _width = 300;

// 气泡提示高

private int _height = 100;

// 设定循环的步长

private int _step = 30;

// 每步时间

private int _stepTime = 30;

// 显示时间

private int _displayTime = 6000;

// 目前申请的气泡提示数量

private int _countOfToolTip = 0;

// 当前最大气泡数

private int _maxToolTip = 0;

// 在屏幕上显示的最大气泡提示数量

private int _maxToolTipSceen;

// 字体

private Font _font;

// 边框颜色

private Color _bgColor;

// 背景颜色

private Color _border;

// 消息颜色

private Color _messageColor;

// 差值设定

int _gap;

// 是否要求至顶(jre1.5以上版本方可执行)

boolean _useTop = true;

/**

* 构造函数,初始化默认气泡提示设置

*

*/

public ToolTip() {

// 设定字体

_font = new Font("宋体", 0, 12);

// 设定边框颜色

_bgColor = new Color(255, 255, 225);

_border = Color.BLACK;

_messageColor = Color.BLACK;

_useTop = true;

// 通过调用方法,强制获知是否支持自动窗体置顶

try {

JWindow.class.getMethod("setAlwaysOnTop",

new Class[] { Boolean.class });

} catch (Exception e) {

_useTop = false;

}

}

/**

* 重构JWindow用于显示单一气泡提示框

*

*/

class ToolTipSingle extends JWindow {

private static final long serialVersionUID = 1L;

private JLabel _iconLabel = new JLabel();

private JTextArea _message = new JTextArea();

public ToolTipSingle() {

initComponents();

}

private void initComponents() {

setSize(_width, _height);

_message.setFont(getMessageFont());

JPanel externalPanel = new JPanel(new BorderLayout(1, 1));

externalPanel.setBackground(_bgColor);

// 通过设定水平与垂直差值获得内部面板

JPanel innerPanel = new JPanel(new BorderLayout(getGap(), getGap()));

innerPanel.setBackground(_bgColor);

_message.setBackground(_bgColor);

_message.setMargin(new Insets(4, 4, 4, 4));

_message.setLineWrap(true);

_message.setWrapStyleWord(true);

// 创建具有指定高亮和阴影颜色的阴刻浮雕化边框

EtchedBorder etchedBorder = (EtchedBorder) BorderFactory

.createEtchedBorder();

// 设定外部面板内容边框为风化效果

externalPanel.setBorder(etchedBorder);

// 加载内部面板

externalPanel.add(innerPanel);

_message.setForeground(getMessageColor());

innerPanel.add(_iconLabel, BorderLayout.WEST);

innerPanel.add(_message, BorderLayout.CENTER);

getContentPane().add(externalPanel);

}

/**

* 动画开始

*

*/

public void animate() {

new Animation(this).start();

}

}

/**

* 此类处则动画处理

*

*/

class Animation extends Thread {

ToolTipSingle _single;

public Animation(ToolTipSingle single) {

this._single = single;

}

/**

* 调用动画效果,移动窗体坐标

*

* @param posx

* @param startY

* @param endY

* @throws InterruptedException

*/

private void animateVertically(int posx, int startY, int endY)

throws InterruptedException {

_single.setLocation(posx, startY);

if (endY < startY) {

for (int i = startY; i > endY; i -= _step) {

_single.setLocation(posx, i);

Thread.sleep(_stepTime);

}

} else {

for (int i = startY; i < endY; i += _step) {

_single.setLocation(posx, i);

Thread.sleep(_stepTime);

}

}

_single.setLocation(posx, endY);

}

/**

* 开始动画处理

*/

public void run() {

try {

boolean animate = true;

GraphicsEnvironment ge = GraphicsEnvironment

.getLocalGraphicsEnvironment();

Rectangle screenRect = ge.getMaximumWindowBounds();

int screenHeight = (int) screenRect.height;

int startYPosition;

int stopYPosition;

if (screenRect.y > 0) {

animate = false;

}

_maxToolTipSceen = screenHeight / _height;

int posx = (int) screenRect.width - _width - 1;

_single.setLocation(posx, screenHeight);

_single.setVisible(true);

if (_useTop) {

_single.setAlwaysOnTop(true);

}

if (animate) {

startYPosition = screenHeight;

stopYPosition = startYPosition - _height - 1;

if (_countOfToolTip > 0) {

stopYPosition = stopYPosition

- (_maxToolTip % _maxToolTipSceen * _height);

} else {

_maxToolTip = 0;

}

} else {

startYPosition = screenRect.y - _height;

stopYPosition = screenRect.y;

if (_countOfToolTip > 0) {

stopYPosition = stopYPosition

+ (_maxToolTip % _maxToolTipSceen * _height);

} else {

_maxToolTip = 0;

}

}

_countOfToolTip++;

_maxToolTip++;

animateVertically(posx, startYPosition, stopYPosition);

Thread.sleep(_displayTime);

animateVertically(posx, stopYPosition, startYPosition);

_countOfToolTip--;

_single.setVisible(false);

_single.dispose();

} catch (Exception e) {

throw new RuntimeException(e);

}

}

}

/**

* 设定显示的图片及信息

*

* @param icon

* @param msg

*/

public void setToolTip(Icon icon, String msg) {

ToolTipSingle single = new ToolTipSingle();

if (icon != null) {

single._iconLabel.setIcon(icon);

}

single._message.setText(msg);

single.animate();

}

/**

* 设定显示的信息

*

* @param msg

*/

public void setToolTip(String msg) {

setToolTip(null, msg);

}

/**

* 获得当前消息字体

*

* @return

*/

public Font getMessageFont() {

return _font;

}

/**

* 设置当前消息字体

*

* @param font

*/

public void setMessageFont(Font font) {

_font = font;

}

/**

* 获得边框颜色

*

* @return

*/

public Color getBorderColor() {

return _border;

}

/**

* 设置边框颜色

*

* @param _bgColor

*/

public void setBorderColor(Color borderColor) {

this._border = borderColor;

}

/**

* 获得显示时间

*

* @return

*/

public int getDisplayTime() {

return _displayTime;

}

/**

* 设置显示时间

*

* @param displayTime

*/

public void setDisplayTime(int displayTime) {

this._displayTime = displayTime;

}

/**

* 获得差值

*

* @return

*/

public int getGap() {

return _gap;

}

/**

* 设定差值

*

* @param gap

*/

public void setGap(int gap) {

this._gap = gap;

}

/**

* 获得信息颜色

*

* @return

*/

public Color getMessageColor() {

return _messageColor;

}

/**

* 设定信息颜色

*

* @param messageColor

*/

public void setMessageColor(Color messageColor) {

this._messageColor = messageColor;

}

/**

* 获得循环步长

*

* @return

*/

public int getStep() {

return _step;

}

/**

* 设定循环步长

*

* @param _step

*/

public void setStep(int _step) {

this._step = _step;

}

public int getStepTime() {

return _stepTime;

}

public void setStepTime(int _stepTime) {

this._stepTime = _stepTime;

}

public Color getBackgroundColor() {

return _bgColor;

}

public void setBackgroundColor(Color bgColor) {

this._bgColor = bgColor;

}

public int getHeight() {

return _height;

}

public void setHeight(int height) {

this._height = height;

}

public int getWidth() {

return _width;

}

public void setWidth(int width) {

this._width = width;

}

public static void main(String[] args) {

ToolTip tip = new ToolTip();

tip.setToolTip(new ImageIcon("test.jpg"),"“程序员”就是特指越写程序身材越“圆”那群人 -- cping1982");

}

}

java 气泡_Java气泡提示功能实现相关推荐

  1. Eclipse for android 中设置java和xml代码提示功能(转)

    1.设置 java 文件的代码提示功能 打开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist & ...

  2. java点赞_java实现点赞功能示例

    最近做了一个评论的点赞功能,感觉有必要记录一下. 思路: 点赞功能,看起来挺简单,但是做的高效稳定还是需要一些处理. 归纳思路如下: 1.点赞接口要利用redis做点赞次数限制,比如一分钟之内最多点赞 ...

  3. java 搜索_Java实现搜索功能代码详解

    首先,我们要清楚搜索框中根据关键字进行条件搜索发送的是Get请求,并且是向当前页面发送Get请求 //示例代码 请求路径为当前页面路径 "/product" 当我们要实现多条件搜索 ...

  4. java抽奖_Java实现抽奖功能

    需求简介 新项目有一个类似王者荣耀抽奖的功能:抽取花费积分,积累幸运值,每阶段幸运值可以抽取到不同的奖品,幸运值集满时,必得稀有道具 功能实现预期:建立一个抽奖池(抽奖池级别根据type区分),奖品在 ...

  5. java抢红包_Java实现抢红包功能

    采用多线程模拟多人同时抢红包.服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家.每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时 ...

  6. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  7. Eclipse输入Java和XML代码自动提示功能最简单的方法

    Eclipse输入Java和XML代码自动提示功能 1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > ...

  8. [转]Android 代码自动提示功能

    源地址http://blog.sina.com.cn/s/blog_7dbac12501019mbh.html 或者http://blog.csdn.net/longvslove/article/de ...

  9. java 气泡 提示插件_Java气泡提示功能实现

    Java气泡提示功能实现 package org.loon.swing.display; import java.awt.BorderLayout; import java.awt.Color; im ...

最新文章

  1. 用C语言做的 一个整人的小程序
  2. linux 下Python调用C模块
  3. [2019.3.4]BZOJ1213 [HNOI2004]高精度开根
  4. vue-resource
  5. Ninject依赖注入(一)
  6. tensorflow2.1学习--认识张量和常用函数一
  7. LINQ to XML:如何读写XCData
  8. 计算机有的应用连不上网络设置,电脑应用程序错误连不上网
  9. andriod获取带字母的iccid
  10. 开发人员和产品人员对接需求总结
  11. day05数据类型(上)
  12. ArcMap学习笔记(十一)数字地形模型分析
  13. 《精要主义》读书笔记(一)
  14. [需求管理-2]:什么是需求以及需求的收集与识别
  15. ibm服务器怎么装win7系统安装系统,联想ibmx3100m4安装win7系统详细教程
  16. 金山滨海地图导览(上海南至金山卫铁路22号线)
  17. as5300g2 nas软件功能_硬件与软件齐飞,首款支持2.5G网络的品牌NAS-华芸AS-5202T测评体验...
  18. 如何在职场中更快地成长
  19. 什么是知识库,内部知识库和外部知识库各有什么优势?
  20. axios 跨域通信

热门文章

  1. stelnet 简介 华为ssh的另一种称呼
  2. docker 删除镜像报错 image is referenced in multiple repositories
  3. 解决工控网络通信协议威胁的实践
  4. 获取用户Ip地址通用方法常见安全隐患 x-forwarded-for
  5. 群晖系统挂载NTFS硬盘
  6. ASP.NETcompilation debug=false targetFramework=4.0/错误
  7. IDA中的SIG应用
  8. Windows远程连接的实现
  9. TCP/IP详解--第十三章
  10. python如何调用字典_如何访问python字典里的值?(实例解析)