Как уведомить пользователя о важных событиях для настольного приложения?

StackOverflow https://stackoverflow.com/questions/629388

Вопрос

Для выполнения своей работы наш клиент использует наше программное обеспечение (приложение Java Swing, запущенное с помощью Webstart), а также другое программное обеспечение, такое как MS Office. Время от времени в нашей программе происходят важные события, с которыми ему приходится сталкиваться без особых задержек. Клиент хочет получить заметное уведомление. Теперь он может использовать Excel в данный момент, поэтому всплывающего окна с сообщением будет недостаточно (хотя запись на панели задач будет мигать).

Нам нужен какой-то механизм, такой как уведомитель Outlook, то есть всплывающее окно, которое всегда видно, но не захватывает фокус. Уведомитель должен отображаться все время, пока не исчезнет причина сообщения (пользователь решил проблему) или пользователь не закроет сообщение (как в outlook). Кроме того, мы хотим отобразить значок в трее и, возможно, воспроизвести звук.

Я пробовал Java6 java.awt.SystemTray, а также JDIC (версия 0.9, поскольку у нас уже есть эта библиотека в пути к классам этого проекта), но я не нашел способа установить время ожидания для TrayIcon.displayMessage, и сообщение, кажется, не всегда находится сверху.

Есть ли другой вариант, кроме JNI, для достижения запрошенного поведения?

Если JNI является единственным выбором и поскольку Windows является единственной платформой для наших клиентов, является ли Outlook уведомителем только для Outlook или его можно свободно использовать через Windows API?

Или какие существуют другие варианты, чтобы уведомить пользователя о важной задаче, выполняемой в одном программном обеспечении, не мешая ему выполнить свою текущую задачу в другом программном обеспечении. Системный модальный диалог, следовательно, не вариант!

Это было полезно?

Решение

Попробуйте использовать setAlwaysOnTop в вашем JFrame / JWindow.

Другие советы

В OS X очевидным ответом будет использование Growl . Но существует небольшой проект, выполняющий аналогичный сервис в среде Windows. Он называется Snarl . Это может дать вам новую возможность попробовать.

Недостаток: вам придется установить инструмент на клиентские машины. Из вашего описания я предполагаю, что у вас есть определенная группа пользователей на рабочих местах компании, верно? Тем не менее, это может быть приемлемым.

Использование лотка. Какой компонент используется для отображения сообщения (JPopup, JDialog, JFrame, JWindow)?

Независимо от того, что вы используете, попробуйте отключить его (переопределите метод isFocusable ) и вызовите toFront .

Также дайте мне знать результат.

Если у вас есть бюджет, рассмотрите лицензию на JIDE . В JIDE есть всплывающее окно с предупреждением, которое выглядит точно так же, как виджет всплывающего окна / предупреждения Outlook.

Вот пример:

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)
    {
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top