Question

Notre client utilise notre logiciel (l’application Java Swing démarrée avec Webstart) en plus d’autres logiciels comme MS Office, pour faire son travail. De temps en temps, il doit traiter sans délai des événements importants dans notre logiciel. Le client veut alors avoir une notification importante. Maintenant, il utilise peut-être Excel pour le moment, donc afficher une boîte de message ne suffira pas (bien que l'entrée dans la barre des tâches clignote).

Nous avons besoin d’un mécanisme tel que le notificateur Outlook, c’est-à-dire une fenêtre contextuelle toujours visible, mais ne dérobant pas le focus. Le notifiant doit être affiché en permanence jusqu'à ce que le motif du message disparaisse (l'utilisateur a résolu le problème) ou que l'utilisateur ait fermé le message (comme dans Outlook). De plus, nous souhaitons afficher une icône dans la barre des tâches et éventuellement émettre un son.

J'ai essayé Java6 java.awt.SystemTray ainsi que JDIC (version 0.9 car nous avons déjà cette bibliothèque dans l'équivalent du chemin de classe de ce projet), mais je n'ai pas trouvé le moyen de définir le délai d'expiration du fichier. TrayIcon.displayMessage et le message ne semble pas toujours au premier plan.

Existe-t-il une option autre que JNI pour obtenir le comportement demandé?

Si JNI est le seul choix et que Windows est la seule plate-forme de nos clients, Outlook notifier est-il une fonctionnalité réservée à Outlook ou est-il librement utilisable via l'API Windows?

Ou quelles autres options existent pour informer l'utilisateur d'une tâche importante à effectuer dans un logiciel sans l'empêcher de terminer sa tâche actuelle dans un autre logiciel. Un dialogue système modal n’est donc pas une option!

Était-ce utile?

La solution

Essayez d’utiliser setAlwaysOnTop sur votre JFrame / JWindow.

Autres conseils

Sous OS X, la solution évidente serait d’utiliser Growl . Mais il existe un petit projet faisant un service similaire sur les environnements Windows. C'est ce qu'on appelle Snarl . Cela pourrait vous donner une nouvelle option à essayer.

Inconvénient: vous devrez installer un outil sur les machines du client. D'après votre description, je suppose que vous avez un groupe défini d'utilisateurs sur les lieux de travail de l'entreprise, n'est-ce pas? Donc, cela pourrait être acceptable, néanmoins.

Utilisation du bac: Quel composant utilisez-vous pour afficher un message (JPopup, JDialog, JFrame, JWindow)?

Quel que soit votre choix, essayez de le rendre non focalisable (substituez la méthode à la méthode isFocusable ) et appelez toFront .

Faites-moi également savoir le résultat.

Si vous avez un budget, envisagez une licence pour JIDE . JIDE a une fenêtre contextuelle d’alerte conçue pour ressembler exactement au widget de fenêtre contextuelle / alerte Outlook.

Voici un exemple:

class AlertWindow extends Window implements MouseListener
{
    AlertWindow(JFrame frame)
    {
        super(frame);
        this.setAlwaysOnTop(true);
        this.setFocusable(false);
        this.setSize(200, 200);
        this.setLocation(500, 0);
        this.setBackground(Color.BLACK);
        addMouseListener(this);

        try {
            Class<?> awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities");
            Method mSetWindowOpacity = awtUtilitiesClass.getMethod("setWindowOpacity", Window.class, float.class);
            mSetWindowOpacity.invoke(null, this, Float.valueOf(0.50f));
        } 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();
        }
    }

    public void mouseClicked(MouseEvent e)
    {
        this.setVisible(false);
    }

    public void mousePressed(MouseEvent e)
    {
    }

    public void mouseReleased(MouseEvent e)
    {
    }

    public void mouseEntered(MouseEvent e)
    {
    }

    public void mouseExited(MouseEvent e)
    {
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top