21

Using Java and Swing, is there any (convenient) way to create a notification? By notification, I mean something like:

this , this
(source: maketecheasier.com)
, or this
(source: microsoft.com)

(Is there a more correct term for that?). It would be nice if it worked cross-platform, but I'm mainly concerned with it working under Ubuntu with Gnome. If at all possible, I would like to avoid having an icon in the system tray / notification area.

If all else fails, I could always use the sliding notification from Sliding Notification bar in java (a la Firefox)

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Jeremy
  • 2,826
  • 7
  • 29
  • 25

4 Answers4

29

You might need a translucent frame without decorations.

Quick demo

OSX

enter image description here]

You can take advantage JLabel displays simple 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 <a href="http://stackoverflow.com/users/20654/oscarryz">Oscar Reyes</a>
 */
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("<html><body><font size='50'>%s</font></body></html>",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();
            }
    }
}
OscarRyz
  • 196,001
  • 113
  • 385
  • 569
  • That's the nicest looking thing I've seen so far, so I'll go with it (-: It's too bad that there isn't (as far as I know) a way to use the native notifications from swing. – Jeremy Jul 14 '10 at 21:27
  • 4
    Java supports this now natively. http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html – kazanaki Aug 20 '12 at 08:37
  • 1
    broken links @OscarRyz – omushpapa Dec 24 '17 at 15:57
15

A standard way to do it is to use Swing TrayIcon API. That would probably be the most convenient way too :)

Mattie
  • 20,280
  • 7
  • 36
  • 54
Eugene Ryzhikov
  • 17,131
  • 3
  • 38
  • 60
  • 1
    At a guess, displayMessage will generate the style shown in the third screenshot. On Windows, at any rate. – Powerlord Jul 13 '10 at 19:42
  • 1
    On my system, that ends up looking like this: http://i.imgur.com/tfTkv.png (I was hoping for something closer to the native gnome notification) – Jeremy Jul 13 '10 at 19:54
  • 1
    It is possible to create custom notification window, but it would be less "convenient". Basically it involves creating a window with FocusListener such that window closes when it loses focus. Obviously you will be able to do your own panting. For animation effects I would suggest Trident library found at http://kenai.com/projects/trident/pages/Home – Eugene Ryzhikov Jul 13 '10 at 20:09
5

I haven't used this, but JToaster looks like it might be a good match. Also, are you open to using SWT? This might give you some additional options (here's an example).

Matt Solnit
  • 32,152
  • 8
  • 53
  • 57
  • @Jeremy, you probably just need to work more with swing, it is very powerful ( when you get to know it, which btw, may take a while ) – OscarRyz Jul 14 '10 at 16:58
2

I highly recommend following library , it provides normal JFrame inside notification which gives full control .

http://jcarrierpigeon.sourceforge.net/

Mr Coder
  • 8,169
  • 5
  • 45
  • 74