Pergunta

O nosso cliente está usando nosso software (aplicativo Java Swing começou a usar Webstart), além de outro software como o MS Office, fazer o seu trabalho. De vez em quando há eventos importantes que ele tem de lidar em nosso software sem muita demora. O cliente quer ter uma notificação proeminente então. Agora, ele pode estar usando Excel no momento, então aparecendo uma caixa de mensagem não será suficiente (embora a entrada na barra de tarefas estará piscando).

Precisamos de algum mecanismo como o Outlook notificador, ou seja, um pop-up que é sempre visível, mas não roubar o foco. O notificador deve ser exibido o tempo todo até que a razão para a mensagem passou (o usuário tem resolvido o problema) ou o usuário tenha fechado a mensagem (como no Outlook). Além disso, queremos mostrar um ícone na bandeja e talvez tocar um som.

Eu tentei o Java6 java.awt.SystemTray bem como a JDIC (versão 0.9 já que temos que lib no classpath desse projeto) equivalentes, mas eu não encontrar uma maneira de definir o tempo limite da método TrayIcon.displayMessage, ea mensagem não parece estar sempre no topo.

Existe alguma outra opção além JNI para alcançar o comportamento solicitado?

Se JNI é a única escolha e uma vez que o Windows é a única plataforma de nossos clientes, é o Outlook notificador um recurso do Outlook somente, ou é livremente utilizável através da API do Windows?

Ou que existem outras opções para notificar o usuário sobre uma importante tarefa para executar em um software sem prejudicar-lo para completar sua tarefa atual em outro software. Um sistema de diálogo modal, portanto, não é opção!

Foi útil?

Solução

Tente usar setAlwaysOnTop em seu JFrame / JWindow.

Outras dicas

Com o OS X a resposta óbvia seria usar Growl . Mas existe um pequeno projeto fazendo um serviço semelhante em ambientes Windows. É chamado Snarl . Isso pode lhe dar uma nova opção para tentar.

Drawback: Você vai ter que instalar uma ferramenta nas máquinas do cliente. De sua descrição eu assumir que tem um grupo definido de usuários em locais de trabalho da empresa, certo? Portanto, este poder aceitável, no entanto.

Usando Bandeja: qual o componente que você está usando para mostrar mensagem (JPopup, JDialog, JFrame, JWindow)

O que você usar, tentar torná-lo unfocusable (método isFocusable override) e chamada toFront.

Também deixe-me saber o resultado.

Se você tem um orçamento, considere uma licença para JIDE . JIDE tem um pop-up de alerta projetado para parecer exatamente como o panorama pop-up widget / alerta.

Aqui está um exemplo:

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)
    {
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top