2010-07-13 3 views
17

Использование Java и Swing, есть ли (удобный) способ создания уведомления? Извещения, я имею в виду что-то вроде:Как создать уведомление в swing

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

(Есть более правильный термин для этого?). Было бы неплохо, если бы он работал кросс-платформенным, но я в основном занимаюсь тем, что он работает под Ubuntu с Gnome. Если это вообще возможно, я хотел бы избежать наличия значка в области панели задач/уведомлений.

Если все остальное терпит неудачу, я всегда мог использовать скользящую уведомление от Sliding Notification bar in java (a la Firefox)

+0

Как сделать то же самое с помощью Libgdx? –

ответ

26

Возможно, вам понадобится translucent frame без украшений.

Быстрый демо

OSX

enter image description here]

Вы можете воспользоваться 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 <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

Это самая красивая вещь, которую я видел до сих пор, ll пойти с ним (-: Слишком плохо, что нет (насколько я знаю) способа использования собственных уведомлений от swing. – Jeremy

+3

Java поддерживает это теперь изначально. http://docs.oracle.com/ javase/tutorial/uiswing/misc/trans_shaped_windows.html – kazanaki

+0

Отличный ответ. Самое главное, он работает на каждой платформе. – kazy

14

Стандартный способ сделать это состоит в использовании Swing TrayIcon API. Вероятно, это был бы самый удобный способ :)

+1

При угадывании displayMessage генерирует стиль, показанный на третьем снимке экрана. В Windows, во всяком случае. – Powerlord

+0

В моей системе это выглядит следующим образом: http://i.imgur.com/tfTkv.png (я надеялся на что-то ближе к уведомлению родного гнома) – Jeremy

+1

Можно создать собственное окно уведомлений, но оно будет менее «удобным». В основном это связано с созданием окна с FocusListener таким образом, что окно закрывается, когда оно теряет фокус. Очевидно, вы сможете сделать свое собственное дыхание. Для анимационных эффектов я бы предложил библиотеку Trident, найденную по адресу http://kenai.com/projects/trident/pages/Home –

4

Я не использовал это, но JToaster выглядит, как будто это может быть хорошим совпадением. Кроме того, вы можете использовать SWT? Это может дать вам дополнительные опции (here's an example).

+0

Хорошая точка. Я, вероятно, должен просто прекратить использовать Swing. – Jeremy

+0

@Jeremy, вам, вероятно, просто нужно больше работать с качелями, это очень мощно (когда вы узнаете об этом, что, возможно, потребуется некоторое время) – OscarRyz

1

Я очень рекомендую следующую библиотеку, он обеспечивает нормальное JFrame в уведомлении, которое дает полный контроль .

http://jcarrierpigeon.sourceforge.net/