`
abian
  • 浏览: 9735 次
社区版块
存档分类
最新评论

SWING 自定义类似android的吐司提示组件

阅读更多

吐司提示框组件

效果截图:



 0 提示 黑色背景色


 1 成功提示 浅蓝色背景色

 

 

 

2  错误提示 粉红色背景色



 

 

package swing.component.label;

import java.awt.Color;
import java.awt.Composite;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.Window;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JWindow;

/**
 * 吐司提示框组件
 * 
 * 
 * @author ccw
 * @since:2014-2-28
 */
public class Toast extends JWindow {

	private static final long serialVersionUID = 1L;
	private String message = "";
	private final Insets insets = new Insets(12, 24, 12, 24);
	private int period = 1500;
	private Font font;
	public static final int msg = 0;// 提示 黑色背景色
	public static final int success = 1;// 成功提示 浅蓝色背景色
	public static final int error = 2;// 错误提示 粉红色背景色
	private Color background;
	private Color foreground;

	/**
	 * 
	 * @param parent
	 *            父窗体 (Frame Dialog Window)
	 * @param message
	 *            消息
	 * @param period
	 *            显示时间
	 */
	public Toast(Window parent, String message, int period) {
		this(parent, message, period, 0);

	}

	/**
	 * 
	 * @param parent
	 * @param message
	 * @param period
	 * @param type
	 *            提示类型 msg:黑色背景色 success :浅蓝色背景色  error: 粉红色背景色
	 */
	public Toast(Window parent, String message, int period, int type) {
		super(parent);
		this.message = message;
		this.period = period;
		font = new Font("宋体", Font.PLAIN, 14);
		setSize(getStringSize(font, true, message));
		// 相对JFrame的位置
		setLocationRelativeTo(parent);
		installTheme(type);

	}

	@Override
	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		// old
		Composite oldComposite = g2.getComposite();

		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setFont(font);
		FontMetrics fm = g2.getFontMetrics();
		g2.setColor(background);
		g2.fillRoundRect(0, 0, getWidth(), getHeight(), 12, 12);
		g2.setColor(foreground);
		g2.drawString(message, insets.left, fm.getAscent() + insets.top);
		// restore
		g2.setComposite(oldComposite);
	}

	/**
	 * 启动提示
	 */

	public void start() {
		this.setVisible(true);
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				setVisible(false);
			}
		}, period);
	}

	/**
	 * 修改消息
	 * @param message
	 */
	public void setMessage(String message) {
		this.message = message;
		Dimension size = getStringSize(font, true, message);
		setSize(size);
		revalidate();
		repaint(0, 0, size.width, size.height);
		if (!isVisible()) {
			start();
		}
	}

	/*
	 * 设置样式
	 */
	private void installTheme(int type) {
		switch (type) {
		case msg:
			background = new Color(0x515151);
			foreground = Color.WHITE;
			break;
		case success:
			background = new Color(223, 240, 216);
			foreground = new Color(49, 112, 143);
			break;
		case error:
			background = new Color(242, 222, 222);
			foreground = new Color(221, 17, 68);
			break;

		default:
			background = new Color(0x515151);
			foreground = Color.WHITE;
			break;
		}
	}

	/**
	 * 得到字符串的宽-高
	 * 
	 * @param font
	 *            字体
	 * @param isAntiAliased
	 *            反锯齿
	 * @param text
	 *            文本
	 * @return
	 */
	private Dimension getStringSize(Font font, boolean isAntiAliased,
			String text) {
		FontRenderContext renderContext = new FontRenderContext(null,
				isAntiAliased, false);
		Rectangle2D bounds = font.getStringBounds(text, renderContext);
		int width = (int) bounds.getWidth() + 2 * insets.left;
		int height = (int) bounds.getHeight() + insets.top * 2;
		return new Dimension(width, height);
	}

}


测试 
package swing.component.label;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * JLabel 支持GIF图像 very excited
 * 吐司组件的使用
 * @author CCW
 * @date 2014-2-23
 * @since v1.0
 */
public class LabelTest {
	public static void main(String[] args) {
		JFrame frame = new JFrame();

		JPanel panel = new JPanel();
		panel.setAlignmentX(0.5f);
		panel.setAlignmentY(1.0f);
		BoxLayout boxLayout = new BoxLayout(panel, BoxLayout.X_AXIS);

		panel.setLayout(boxLayout);

		/**
		 * 1-吐司组件的使用
		 */
		final Toast toast = new Toast(frame, "北京市没有权限访问", 5000, Toast.error);
		
		JLabel label = new JLabel("text");
		panel.add(label);
		JButton start = new JButton("start");
		start.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				/**
				 * 2-显示吐司组件
				 */
				toast.start();
				

			}
		});
		panel.add(start);
		
		JButton update = new JButton("update message");
		update.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				/**
				 * 3-修改组件消息提示内容
				 */
				toast.setMessage(Math.random() + "");

			}
		});
		
		panel.add(update);
		frame.add(panel);
		frame.setSize(960, 660);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		frame.setVisible(true);
	}

}
 

 

  • 大小: 4.1 KB
  • 大小: 4 KB
  • 大小: 4.1 KB
分享到:
评论

相关推荐

    swing自定义JTabbedPane组件外观

    下面将详细探讨如何通过Java Swing自定义`JTabbedPane`组件的外观。 首先,我们需要了解`JTabbedPane`的基本用法。创建一个`JTabbedPane`实例非常简单: ```java JTabbedPane tabbedPane = new JTabbedPane(); ```...

    Java Swing自定义观感(仅以自定义treeUI为例)

    Java Swing是Java GUI编程的重要工具,它提供了丰富的组件和接口,允许开发者构建用户界面。"Look and Feel"(观感)是Swing中一个关键的概念,它决定了应用程序的视觉样式和交互体验。Java Swing默认提供了多种观感...

    swing中自定义对话框的几种实际用法

    Swing是Java编程环境中用于构建图形用户界面(GUI)的一个重要工具包,它提供了丰富的组件和功能,使得开发者能够创建出美观且功能强大的桌面应用程序。在Swing中,对话框是一种特殊的窗口,用于向用户提供临时信息...

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

    总的来说,这段代码提供了一种在Swing应用中实现气泡浮动提示窗口的方法,通过自定义组件和布局,结合颜色、字体等设计元素,以及动画效果,创建了一个具有视觉吸引力且功能完备的提示机制。开发者可以根据实际需求...

    自定义Swing组件代码

    通过阅读和理解这些源码,你可以加深对Swing组件自定义的理解,并将其应用到自己的项目中。 总的来说,自定义Swing组件是一项技术性强且富有创造性的任务。通过继承、实现接口或装饰模式,我们可以根据需求打造独特...

    Swing 扩展组件 Swing 扩展组件

    Swing还支持自定义组件,开发者可以通过继承现有的组件类并重写其方法,或者使用`JComponent`类来构建完全自定义的UI元素。这种灵活性使得Swing成为Java GUI开发的强大工具,可以满足各种复杂应用的需求。 在实际...

    swing自定义按钮

    在Java的Swing库中,开发人员经常需要创建具有独特外观和行为的自定义组件,以满足特定的应用程序需求。本篇文章将详细讲解如何利用Swing来实现自定义按钮,特别是根据不同形状的图片来绘制按钮,并赋予按钮三种状态...

    swing自定义 button

    总结来说,Java Swing的`JButton`组件提供了丰富的功能,允许开发者自定义按钮的外观、行为和交互。通过添加事件监听器,我们可以捕获用户的点击操作,并执行相应的业务逻辑。结合其他组件和接口,如`Action`、`...

    Swing自定义的窗体样式

    在Swing开发中,需要给用户一个比较漂亮的UI提高操作体验感。本示例中使用几行代码就实现了窗体和内部窗体换肤效果,以及让窗体不能调整大小、窗体置中,以及除去窗体的装饰条--看不到最小化、最大化和关闭按钮,...

    Swing自定义按钮

    Swing自定义按钮的样式形状等,有源码.

    Java Swing自定义标签边界.rar

    Java基于要SWing技术自定义标签的边界效果,通过javax.swing.border.Border 接口,进行自定义边界类OwnBorder。可以实现空边界(EmptyBorder)、斜切边界(BevelBorder)、蚀刻边界(EtchedBorder)、线条边界...

    JFC SWING—JAVA 基础类组件集

    而 Swing 是建立在 AWT 之上的轻量级框架,它的组件不依赖于底层操作系统,所以可以实现跨平台的一致性,同时提供了更多的功能和自定义选项。 Swing 提供了大量组件,如按钮 (JButton),文本框 (JTextField),滚动...

    Swing用户界面组件

    Swing提供了丰富的组件集,允许开发者创建美观且功能丰富的应用程序。在Swing中,组件通常被称为JComponents,因为它们继承自`javax.swing.JComponent`类。下面将详细探讨Swing用户界面组件及其主要特点。 1. **...

    swing各个组件实例演示

    5. GridBagLayout:最灵活的布局管理器,允许自定义每个组件的大小和位置。 四、Swing组件的属性和外观 Swing组件有许多可配置的属性,如颜色、字体、边距等。此外,Swing支持LookAndFeel,可以改变整个应用程序的...

    swing自制组件(一)

    总的来说,"swing自制组件(一)"这个主题是关于Java Swing编程中的组件扩展,通过分析"RichJLabel.java"我们可以深入理解Swing组件的自定义机制,并学习到如何利用Java Swing创建具有特殊功能的用户界面元素。...

    java JOptionPane自定义请求内容

    1. **自定义组件**:通过创建`JLabel`、`JTextField`和`JPasswordField`等Swing组件,可以将所需的输入字段添加到对话框中。例如,`NameCallback`和`PasswordCallback`的实现就涉及到`JTextField`和`JPasswordField`...

    java Swing用户界面组件

    Swing组件库是基于Java AWT(Abstract Window Toolkit)的,但相比AWT,Swing组件是轻量级的,它们不依赖于操作系统提供的图形组件,这使得Swing应用具有更好的跨平台兼容性。Swing还提供了一些AWT不具备的特性,如...

    java基于Swing组件的GUI设计

    Swing提供了大量的组件,如按钮、文本框、列表、表格等,这些组件可以帮助我们构建复杂的交互式界面。在"java基于Swing组件的GUI设计"这个主题中,我们将深入探讨如何利用Swing进行GUI开发。 首先,Swing组件是轻量...

    基于Swing的类似编辑器的界面

    在这个"基于Swing的类似编辑器的界面"项目中,开发者可能将这些组件和功能组合在一起,创建了一个具有基本编辑功能的简单应用程序。例如,用户可以在选项卡之间切换打开的文件,使用复制功能在文件间移动文本,通过...

    Swing_自定义ColorChooser&ColorCombobox

    总之,这些自定义组件的实现展示了如何扩展Swing的基本组件以满足特定需求,这对于提升Java GUI应用的用户体验和界面美观性具有重要意义。开发者可以根据自己的项目需求,参考这些代码进行相应的定制和优化。

Global site tag (gtag.js) - Google Analytics