用户切换浏览器选项卡时如何从 JApplet 中隐藏 JDialog?

Posted

技术标签:

【中文标题】用户切换浏览器选项卡时如何从 JApplet 中隐藏 JDialog?【英文标题】:How to hide JDialog from JApplet when user switch browser tab? 【发布时间】:2011-11-26 22:21:42 【问题描述】:

问题:用户从小程序开始长时间操作;显示带有进度条的 JDialog。用户打开/切换到另一个浏览器选项卡 - JDialog 仍然显示(并且惹恼了用户)。

当用户切换到另一个选项卡时,JDialog 应该被隐藏;并在用户切换回来时再次显示。

注意:我看到有类似问题的问题,解决方案是添加 windowActivated/deactivated 侦听器。它对我不起作用,因为窗口中有多个框架,其中一个包含小程序。当用户单击另一个框架时,会强制转换 windowDeactivate 事件,但用户仍在同一选项卡中。

【问题讨论】:

你是如何初始化JDialog with progress bar is displayed的,因为如果来自Listener,那么应该在Listener的所有Action结束时完成, 嗨,兄弟,有什么解决办法吗?我面临同样的问题:( @khoi nguyen 添加解决方案 【参考方案1】:

尝试将小程序指定为对话框的所有者:

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

其中“this”是 JApplet。希望这会在每次父母失去焦点时激活/停用对话框。

【讨论】:

另外,请确保您已将 alwaysOnTop() 设置为 false。否则你会很困惑。【参考方案2】:

解决方案:为所有帧添加监听器

<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>

【讨论】:

以上是关于用户切换浏览器选项卡时如何从 JApplet 中隐藏 JDialog?的主要内容,如果未能解决你的问题,请参考以下文章

在Firefox中切换浏览器选项卡时jquery动画中断

最大化浏览器和切换选项卡时,媒体查询不会更改 CSS

以编程方式切换选项卡时清除根视图控制器的变量

切换选项卡时未调用 NSFetchedResultsControllerDelegate 方法

当通过手势识别器滑动切换到仅点击选项卡时,在 tabbarcontroller 中切换选项卡会给出不同的结果

当用户返回到 UITabBarController 选项卡时如何刷新表数据