Как скрыть JDialog от JApplet, когда пользователь переключает вкладку браузера? - PullRequest
4 голосов
/ 28 сентября 2011

Проблема: пользователь запускает длительную операцию из апплета; JDialog с индикатором выполнения отображается. Пользователь открывает / переключается на другую вкладку браузера - JDialog все еще отображается (и раздражает пользователя).

JDialog должен быть скрыт, когда пользователь переключается на другую вкладку; и отображается снова, когда пользователь переключается обратно.

Примечание: я видел вопрос с похожей проблемой, где было решено добавить обработчик окна «Активированный / деактивированный». Это не работает для меня, потому что есть несколько кадров в окне, и один из них содержит апплет. Когда пользователь нажимает на другой фрейм, событие windowDeactivate преобразуется, но пользователь остается на той же вкладке.

Ответы [ 2 ]

3 голосов
/ 28 сентября 2011

Попробуйте указать апплет в качестве владельца диалога:

JDialog dialog = new JDialog(SwingUtilities.windowForComponent(this));

, где "это" - JApplet. Надеюсь, это будет активировать / деактивировать диалог каждый раз, когда родитель теряет фокус.

0 голосов
/ 26 апреля 2014

Решение: добавить слушателей ко всем кадрам

<head>

    ...
    <script type="text/javascript">
        onBlur=function(event) { window.focusFlag = false; };
        onFocus=function(event){ window.focusFlag = true; };
        function createFocusListeners()
        {
            window.focusFlag = true;

            if (/*@cc_on!@*/false) { // check for Internet Explorer
                document.onfocusin = onFocus;
                document.onfocusout = onBlur;
            } else if (typeof window.addEventListener != "undefined"){
                document.getElementById('topFrame').contentWindow.addEventListener('focus',onFocus, false);
                document.getElementById('topFrame').contentWindow.addEventListener('blur',onBlur, false);
                document.getElementById('leftFrame').contentWindow.addEventListener('focus',onFocus, false);
                document.getElementById('leftFrame').contentWindow.addEventListener('blur',onBlur, false);
                document.getElementById('mainFrame').contentWindow.addEventListener('focus',onFocus, false);
                document.getElementById('mainFrame').contentWindow.addEventListener('blur',onBlur, false);
                window.addEventListener('focus',onFocus, false);
                window.addEventListener('blur',onBlur, false);
            }
        };

        //main frame is constantly reloaded, must add listener after each reload
        window.createMainFrameFocusListeners = (function () {
            if (typeof window.addEventListener != "undefined"){
        document.getElementById('mainFrame').contentWindow.addEventListener('focus',onFocus, false);
        document.getElementById('mainFrame').contentWindow.addEventListener('blur',onBlur, false);
        }
        });
    </script>
</head>


<frameset rows="32,*" cols="*" onload="createFocusListeners();">
    <frame id="topFrame" src="MenuFrame.jspx" name="topFrame" scrolling="NO" noresize="noresize"/>
    <frameset rows="*" cols="280,*">
        <frame id="leftFrame" src="TreeFrame.jspx" name="leftFrame" scrolling="NO"/>
        <frame id="mainFrame" src="ListView.jspx" name="mainFrame" scrolling="NO"/>
    </frameset>
</frameset>
...