在JInternalFrame中使用JCEF时,JFrame中的JTextField无法编辑,直到JFrame失去焦点

问题描述

我已经开始在我的项目中实现JCEF,并且在JInternalFrame内的JFrame中初始化嵌入式浏览器,并在{ JPanel旁边的{1}}。在JInternalFrame实际上变得可见之前,浏览器组件不会完全初始化,并且我发现我的JFrame是不可编辑的,除非JTextField失去并重新获得焦点。

任何可能发生的事情以及如何解决的想法?仅在将JFrame与JCEF组件一起使用时会发生这种情况...

每次我调用JInternalFrame在浏览器中加载新页面时,也会发生这种情况:loadURL再次变得不可编辑,直到我失去/获得对JTextField的关注。 / p>


更新: 我发现了一个允许JFrame重新变为可编辑状态的hack,但是由于它不是很好,所以我不称其为解决方案。我在JTextField方法上用client.addLoadHandler(new CefLoadHandlerAdapter()) 向CefClient实例(@Ovveride)添加了一个加载处理程序,从而可以访问当前的浏览器组件。从那里,我可以检测到何时完成浏览器中的加载,并使用SwingUtilities获取浏览器组件所在的窗口。然后,我在该窗口上onLoadingStateChangesetVisible(false)。我说这不是解决方案,因为每次浏览器完成加载后,Window就会消失并重新出现。即使setVisible(true)可以再次编辑,但看到窗口闪烁还是很丑陋的。我尝试了各种JTextFieldrevalidate()方法,但没有成功,除非我没有正确地称呼它们。

repaint()

如果有人可以提出更好的解决方案,请这样做!

解决方法

我通过更好地研究示例JCEF应用程序解决了这个问题。我需要实现一个FocusHandler来释放嵌入式浏览器对键盘输入的控制:

private boolean browserFocus_ = true;
---
jTextField1.addFocusListener(new FocusAdapter() {
    @Override
    public void focusGained(FocusEvent e) {
      if (!browserFocus_) return;
      browserFocus_ = false;
      KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
      jTextField1.requestFocus();
    }
});

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...