2010-07-13 12 views
17

Mit Java und Swing gibt es eine (bequeme) Möglichkeit, eine Benachrichtigung zu erstellen? Durch Benachrichtigung, ich meine so etwas wie:So erstellen Sie eine Benachrichtigung im Wechsel

this http://productivelinux.com/images/notify-osd-screenshot.png, this http://images.maketecheasier.com/2010/01/kfirefox-notify-indexed.png, oder this

(Gibt es eine korrekte Bezeichnung für das?). Es wäre schön, wenn es plattformübergreifend funktioniert, aber hauptsächlich geht es mir darum, mit Gnome unter Ubuntu zu arbeiten. Wenn es möglich ist, möchte ich vermeiden, ein Symbol in der Taskleiste/im Infobereich zu haben.

Wenn alles andere fehlschlägt, könnte ich immer die gleitende Benachrichtigung von Sliding Notification bar in java (a la Firefox)

+0

Wie funktioniert das Gleiche mit Libgdx? –

Antwort

26

Sie könnten eine translucent frame ohne Dekorationen benötigen.

Schnell Demo

OSX

enter image description here]

Sie können die Vorteile nehmen JLabel zeigt einfache 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(); 
      } 
    } 
} 
+0

Das ist das schönste Ding, das ich bisher gesehen habe, also ' Ich werde damit gehen (-: Es ist schade, dass es nicht (soweit ich weiß) eine Möglichkeit gibt, die nativen Benachrichtigungen von Swing zu verwenden. – Jeremy

+3

Java unterstützt dies jetzt nativ. http://docs.oracle.com/ javase/tutorial/uiswing/misc/trans_shaped_windows.html – kazanaki

+0

Große Antwort, vor allem funktioniert es auf jeder Plattform – kazy

14

verwenden Ein Standard-Weg, es zu tun ist Swing TrayIcon API zu verwenden. Das wäre wahrscheinlich der bequemste Weg auch :)

+1

Bei einer Schätzung generiert displayMessage den im dritten Screenshot gezeigten Stil. Unter Windows jedenfalls. – Powerlord

+0

Auf meinem System sieht das schließlich so aus: http://i.imgur.com/tfTkv.png (Ich hoffte auf etwas, das näher an der nativen Gnome-Benachrichtigung ist) – Jeremy

+1

Es ist möglich, ein eigenes Benachrichtigungsfenster zu erstellen, aber es wäre weniger "praktisch". Grundsätzlich wird ein Fenster mit FocusListener erstellt, sodass das Fenster geschlossen wird, wenn es den Fokus verliert. Offensichtlich können Sie Ihr eigenes Keuchen machen. Für Animationseffekte würde ich vorschlagen, Trident-Bibliothek finden Sie unter http://kenai.com/projects/trident/pages/Home –

4

Ich habe das nicht verwendet, aber JToaster sieht aus wie es könnte ein gutes Spiel sein. Sind Sie auch offen für SWT? Dies könnte Ihnen einige zusätzliche Optionen geben (here's an example).

+0

Guter Punkt. Ich sollte wahrscheinlich aufhören, Swing zu benutzen. – Jeremy

+0

@ Jeremy, du musst wahrscheinlich nur mehr mit Swing arbeiten, es ist sehr mächtig (wenn du es kennenlernst, was übrigens, kann eine Weile dauern) – OscarRyz

Verwandte Themen