`

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

阅读更多
效果超炫,看附件截图

package monitor.ico;
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) {
    	try {
    		// 多个文件变化时,每个间隔2秒
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        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("F:\\a.jpg"),"我就是一农民 ---xbgd");

    }

}
  • 大小: 23.8 KB
分享到:
评论

相关推荐

    java Swing 气泡浮动提示窗口代码

    8. **继承和封装**:`ToolTipSingle` 类继承自 `JWindow`,并添加了自定义的组件和方法,实现了气泡提示的功能。 9. **事件处理**:虽然在提供的代码片段中没有明确提及,但通常提示窗口会与用户的交互事件关联,如...

    Java气泡提示功能实现

    在Java编程中,实现气泡提示功能是一种常见的用户界面交互设计,它可以帮助用户更好地理解界面上各个元素的作用或提供额外信息。本篇文章将详细介绍如何在Java中创建一个气泡提示功能,以及`ToolTip`类在其中起到的...

    java实现托盘、气泡程序源码

    首先,让我们详细了解一下Java中的系统托盘和气泡提示的实现原理: 1. **系统托盘(System Tray)**: 在Java中,系统托盘功能是通过`java.awt.TrayIcon`类提供的,该类是Java Swing库的一部分。要使用系统托盘,...

    含有可链接标签的Swing气泡

    总的来说,这个资源提供了在Swing应用中实现可点击链接标签的方法,对于那些希望增强Java GUI应用交互性的开发者来说,这是一个非常有价值的工具。通过研究和修改给出的代码,开发者可以更好地理解Swing组件的自定义...

    java消息提示框,java气泡提示,自制背景图,可拖动,实用

    网上太难找到满意的例子了,花了一两天功夫找资料研究,终于搞出来了,做了张背景图,表面上已经完全看不出来是用Swing做的了。感兴趣的新同鞋可以自己试试,改改我的代码,用PS做做背景图,可以做出超炫超酷的消息...

    Java Swing仿QQ聊天窗口泡泡风格源代码.rar

    Java Swing仿QQ聊天窗口泡泡风格源代码,现在微信聊天里的也是这种泡泡的风格,这样比以前QQ那种混杂式视觉上更清淅,本款源代码是用Java仿写QQ聊天泡泡窗口模式,其实这款代码是针对Android系统写的,源代码中有很...

    右下角上线提示效果

    2. **图形库**:利用图形库(如Java的Swing或Android的View)来创建可定制的提示窗口,控制其动画效果和布局。 3. **多线程处理**:为了不影响主程序的运行,提示的显示和动画执行通常在单独的线程中进行。 4. **...

    Java balloon Tip Tool

    Java Balloon Tip Tool 是一个基于Java编程语言的实用工具,主要用于在用户界面上显示临时性的提示信息,类似于操作系统中的气泡提示。这种工具通常用于快速传递简短的通知或信息,而不打断用户的正常工作流程。在...

    Java FEI QQ程序编写

    11. **图形和动画**: Swing也支持基本的图形绘制和动画效果,可以用来创建更生动的用户体验,如自定义的气泡提示、表情动画等。 以上是Java FEI QQ程序编写的一些核心知识点,涵盖了GUI设计、网络通信、数据管理等...

    java_qq.rar_QQ提示

    【Java QQ提示】项目是一个基于Java编程语言实现的简易QQ聊天工具,旨在提供基础的聊天提示和警告功能。这个项目对于学习Java编程、网络通信以及GUI界面设计具有很好的实践价值。下面将详细介绍该项目中的关键知识点...

    泡泡龙游戏(JAVA写的)

    对于能够理解并运行这个JAVA版泡泡龙游戏的开发者来说,这表明他们具备扎实的JAVA基础,包括对类、对象、继承、封装、多态等概念的理解,以及对JAVA GUI编程的掌握,如Swing或JavaFX库的使用。 【标签】"泡泡龙游戏...

    Ame UI Dewberries:Java Swing开发的微小增强-开源

    这个库可能包含了各种样式的通知展示方式,如弹出框、气泡提示、托盘通知等,且可能支持自定义动画、声音效果和定时显示,以适应不同的应用场景。 开源软件的特性意味着"Ame UI Dewberries"的源代码对所有人开放,...

    CrazyChat::speech_balloon: 疯聊 - 基于Java Swing编写的即时通讯应用 (in XMETC)

    GUI使用Swing实现,通过Socket实现客户端与服务端之间的通信 工程目录结构为Eclipse项目结构 项目特性/Features 已实现功能 用户注册/登录/修改资料 查找/查看用户资料、添加好友、私聊 好友/群/会话列表 气泡...

    为工具栏按钮添加提示信息

    以Java为例,我们可以使用`javax.swing.JButton`的`setToolTipText(String text)`方法为按钮添加提示。代码示例如下: ```java JButton button = new JButton("保存"); button.setToolTipText("点击保存当前编辑...

    鼠标移动到控件立即显示出对该控件的说明

    这种设计通常被称为“悬停提示”或“气泡提示”,它允许用户在不点击控件的情况下获取关于该控件功能的快速信息,从而增强交互的易用性和效率。 1. **悬停提示的概念**:悬停提示是一种用户界面设计技术,当用户的...

    顶部弹出通知顶部弹出通知

    这可能涉及使用`java.awt`或`javax.swing`包中的基本组件,如`JPanel`,并结合动画效果来模拟顶部弹出的行为。 6. **事件监听与处理**: 创建顶部弹出通知的同时,通常需要监听用户的交互行为,例如点击通知后执行...

    codesky.zip_界面编程_Java_

    通过分析"codesky.zip"中的文件,开发者可以学习如何使用Java来构建类似的界面,包括如何设置布局、添加交互元素、实现动画效果,以及如何优化用户体验。这个项目对于想要提升Java界面编程技能的人来说是一个很好的...

    QQ一样的弹出窗体,超简单简单

    1. **图形用户界面(GUI)框架**:大部分编程语言都有对应的GUI库,例如Java的Swing和JavaFX,C#的Windows Forms和WPF,Python的Tkinter或PyQt。你需要选择一个适合你项目的GUI框架来构建窗体。在这里,由于没有具体...

    系统托盘编程完全指南.rar

    1. 显示气泡提示:可以使用`Shell_NotifyIcon`的NIF_INFO标志,或者在.NET中使用`BalloonTip`方法。 2. 快捷菜单:通过创建并关联一个`ContextMenu`,用户可以通过右键点击托盘图标访问这些菜单项。 3. 图标动画:...

Global site tag (gtag.js) - Google Analytics