我有一个JFrame,其中包含通常的面板和小部件组合,还有一个JPanel,我将其用作该JFrame的glassPane。我希望能够将键盘焦点遍历限制在glassPane中可见的组件上。

我的问题可能会或可能不会因以下事实而复杂化:后台线程启动了一个进程,导致进程对话框出现并随后消失,这从我的glassPane中的小部件中窃取了焦点,但将其返回到我的glassPane下的某个小部件中。

我尝试将JFrame的焦点遍历策略设置为仅允许glassPane聚焦的策略,但这似乎没有任何效果。 (也许我做错了吗?)

任何帮助,将不胜感激。

最佳答案

正如我的评论中提到的那样,我可能会选择J / X / Layer-但是如果确实自定义FTP是您上下文中唯一缺少的部分,那么这是一个解决方案。

要从焦点遍历中排除组件,请使用自定义FTP的accept方法拒绝它们。下面的示例拒绝了所有不是glassPane子级的组件(如果glassPane可见)(请注意:这过于简单,因为它仅处理直接子级,因此实际代码必须沿父链向上移动,直到撞到是否有玻璃)

public static class FTP extends LayoutFocusTraversalPolicy {

    @Override
    protected boolean accept(Component comp) {
        JFrame window = (JFrame) SwingUtilities.windowForComponent(comp);
        if (hasVisibleGlassPane(window)) {
            return comp.getParent() == window.getGlassPane();
        }
        return super.accept(comp);
    }

    private boolean hasVisibleGlassPane(JFrame window) {
        return window != null && window.getGlassPane() != null
                && window.getGlassPane().isVisible();
    }

}

07-26 09:28