java 气泡_Java气泡提示功能实现
一个用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气泡提示功能实现相关推荐
- Eclipse for android 中设置java和xml代码提示功能(转)
1.设置 java 文件的代码提示功能 打开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist & ...
- java点赞_java实现点赞功能示例
最近做了一个评论的点赞功能,感觉有必要记录一下. 思路: 点赞功能,看起来挺简单,但是做的高效稳定还是需要一些处理. 归纳思路如下: 1.点赞接口要利用redis做点赞次数限制,比如一分钟之内最多点赞 ...
- java 搜索_Java实现搜索功能代码详解
首先,我们要清楚搜索框中根据关键字进行条件搜索发送的是Get请求,并且是向当前页面发送Get请求 //示例代码 请求路径为当前页面路径 "/product" 当我们要实现多条件搜索 ...
- java抽奖_Java实现抽奖功能
需求简介 新项目有一个类似王者荣耀抽奖的功能:抽取花费积分,积累幸运值,每阶段幸运值可以抽取到不同的奖品,幸运值集满时,必得稀有道具 功能实现预期:建立一个抽奖池(抽奖池级别根据type区分),奖品在 ...
- java抢红包_Java实现抢红包功能
采用多线程模拟多人同时抢红包.服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家.每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时 ...
- java培训教程分享:Java编写软件代码自动提示功能
本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...
- Eclipse输入Java和XML代码自动提示功能最简单的方法
Eclipse输入Java和XML代码自动提示功能 1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > ...
- [转]Android 代码自动提示功能
源地址http://blog.sina.com.cn/s/blog_7dbac12501019mbh.html 或者http://blog.csdn.net/longvslove/article/de ...
- java 气泡 提示插件_Java气泡提示功能实现
Java气泡提示功能实现 package org.loon.swing.display; import java.awt.BorderLayout; import java.awt.Color; im ...
最新文章
- 用C语言做的 一个整人的小程序
- linux 下Python调用C模块
- [2019.3.4]BZOJ1213 [HNOI2004]高精度开根
- vue-resource
- Ninject依赖注入(一)
- tensorflow2.1学习--认识张量和常用函数一
- LINQ to XML:如何读写XCData
- 计算机有的应用连不上网络设置,电脑应用程序错误连不上网
- andriod获取带字母的iccid
- 开发人员和产品人员对接需求总结
- day05数据类型(上)
- ArcMap学习笔记(十一)数字地形模型分析
- 《精要主义》读书笔记(一)
- [需求管理-2]:什么是需求以及需求的收集与识别
- ibm服务器怎么装win7系统安装系统,联想ibmx3100m4安装win7系统详细教程
- 金山滨海地图导览(上海南至金山卫铁路22号线)
- as5300g2 nas软件功能_硬件与软件齐飞,首款支持2.5G网络的品牌NAS-华芸AS-5202T测评体验...
- 如何在职场中更快地成长
- 什么是知识库,内部知识库和外部知识库各有什么优势?
- axios 跨域通信
热门文章
- stelnet 简介 华为ssh的另一种称呼
- docker 删除镜像报错 image is referenced in multiple repositories
- 解决工控网络通信协议威胁的实践
- 获取用户Ip地址通用方法常见安全隐患 x-forwarded-for
- 群晖系统挂载NTFS硬盘
- ASP.NETcompilation debug=false targetFramework=4.0/错误
- IDA中的SIG应用
- Windows远程连接的实现
- TCP/IP详解--第十三章
- python如何调用字典_如何访问python字典里的值?(实例解析)