데스크탑 애플리케이션에 대한 중요한 이벤트를 사용자에게 알리는 방법은 무엇입니까?

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

문제

우리 고객은 MS Office와 같은 다른 소프트웨어 외에 우리 소프트웨어(Webstart를 사용하여 시작된 Java Swing 응용 프로그램)를 사용하여 업무를 수행하고 있습니다.때때로 우리 소프트웨어에서 큰 지체 없이 처리해야 하는 중요한 이벤트가 있습니다.그러면 고객은 눈에 띄는 알림을 받기를 원합니다.현재 그는 Excel을 사용하고 있을 수 있으므로 메시지 상자를 표시하는 것만으로는 충분하지 않습니다(비록 작업 표시줄의 항목은 깜박입니다).

Outlook 알리미와 같은 메커니즘이 필요합니다.항상 표시되지만 초점을 빼앗지 않는 팝업입니다.알리미는 메시지의 원인이 사라지거나(사용자가 문제를 해결함) 사용자가 메시지를 닫을 때까지(예: Outlook에서) 항상 표시되어야 합니다.추가적으로 트레이 아이콘을 표시하고 소리를 재생하고 싶습니다.

Java6 java.awt.SystemTray 및 JDIC(해당 프로젝트의 클래스 경로에 해당 lib가 이미 있으므로 버전 0.9)와 동등한 것을 시도했지만 TrayIcon.displayMessage의 시간 초과를 설정하는 방법을 찾지 못했습니다. 방법이며 메시지가 항상 맨 위에 표시되지는 않는 것 같습니다.

요청된 동작을 달성하기 위해 JNI 외에 다른 옵션이 있습니까?

JNI가 유일한 선택이고 Windows가 고객의 유일한 플랫폼이라면 Outlook 알리미는 Outlook 전용 기능입니까, 아니면 Windows API를 통해 자유롭게 사용할 수 있습니까?

또는 사용자가 다른 소프트웨어에서 현재 작업을 완료하는 것을 방해하지 않고 한 소프트웨어에서 수행해야 하는 중요한 작업에 대해 사용자에게 알리는 다른 옵션이 있습니까?따라서 시스템 모달 대화 상자는 옵션이 아닙니다!

도움이 되었습니까?

해결책

사용해보십시오 setalwaysontop JFrame/Jwindow에서.

다른 팁

OS X에서 분명한 대답은 다음을 사용하는 것입니다. 으르렁.하지만 Windows 환경에서 비슷한 서비스를 수행하는 작은 프로젝트가 있습니다.그것은 ~라고 불린다 혼란.이를 통해 새로운 시도 옵션이 제공될 수 있습니다.

약점:클라이언트 컴퓨터에 도구를 설치해야 합니다.귀하의 설명에 따르면 회사 작업장에 정의된 사용자 그룹이 있다고 가정합니다. 맞습니까?그럼에도 불구하고 이것은 허용될 수 있습니다.

트레이 사용 : 메시지를 표시하기 위해 어떤 구성 요소를 사용하고 있습니까 (jpopup, jdialog, jframe, jwindow)?

어느 쪽을 사용하든, 그것을 초래할 수 없게 만들어보십시오 (Override isFocusable 방법) 및 호출 toFront.

결과를 알려주세요.

예산이있는 경우 라이센스를 고려하십시오. 지드. Jide에는 Outlook Popup/Alert Widget과 똑같이 보이도록 설계된 경고 팝업이 있습니다.

예는 다음과 같습니다.

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