我有一个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();
}
}