如何在swing中创建通知

使用Java和Swing,是否有任何(方便)方法来创建通知? 通知,我的意思是:

这http://productivelinux.com/images/notify-osd-screenshot.png , 这是http://images.maketecheasier.com/2010/01/kfirefox-notify-indexed.png ,或者 这个

(那是否有更正确的术语?)。 如果它跨平台工作会很好,但我主要关心它在Ubuntu和Gnome一起工作。 如果可能的话,我想避免在系统托盘/通知区域中有一个图标。

如果所有其他方法都失败了,我总是可以使用java中的滑动通知栏中的滑动通知(一个火狐)

您可能需要一个没有装饰的半透明框架 。

快速演示

OSX

在此处输入图像描述 ]

您可以利用JLabel显示简单的HTML

import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.text.*; import java.util.Date; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; /** * Simple demo on how a translucent window * looks like when is used to display the system clock. * @author Oscar Reyes */ class Translucent extends JPanel implements ActionListener { private static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); private final Date now = new Date(); private final Timer timer = new Timer(1000, this); private final JLabel text = new JLabel(); public Translucent() { super(true); timer.start(); } @Override public void actionPerformed(ActionEvent e) { now.setTime(System.currentTimeMillis()); text.setText(String.format("%s",sdf.format(now))); } public static void main(String[] args) { JFrame f = new JFrame(); f.setUndecorated(true); setTranslucency(f); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setBackground(new Color(0f, 0f, 0f, 1f / 3f)); JPanel p = new Translucent(); JLabel l = new JLabel("Hola"); l.setFont(new Font(l.getFont().getName(), Font.PLAIN, 128)); p.add(l); f.add(p); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } // taken from: http://java.sun.com/developer/technicalArticles/GUI/translucent_shaped_windows/ private static void setTranslucency( Window window){ try { Class awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities"); Method mSetWindowOpacity = awtUtilitiesClass.getMethod("setWindowOpacity", Window.class, float.class); if (!mSetWindowOpacity.isAccessible()) { mSetWindowOpacity.setAccessible(true); } mSetWindowOpacity.invoke(null, window, Float.valueOf(0.75f)); } catch (NoSuchMethodException ex) { ex.printStackTrace(); } catch (SecurityException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (IllegalAccessException ex) { ex.printStackTrace(); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } catch (InvocationTargetException ex) { ex.printStackTrace(); } } } 

一种标准的方法是使用Swing TrayIcon API 。 这可能是最方便的方式:)

我没有用过这个,但JToaster看起来可能是一个很好的匹配。 另外,您是否愿意使用SWT? 这可能会给你一些额外的选择( 这是一个例子 )。

我强烈推荐使用以下库,它提供了正常的JFrame内部通知,可以完全控制。

http://jcarrierpigeon.sourceforge.net/