问题描述
我已经开始在我的项目中实现JCEF,并且在JInternalFrame
内的JFrame
中初始化嵌入式浏览器,并在{ JPanel
旁边的{1}}。在JInternalFrame
实际上变得可见之前,浏览器组件不会完全初始化,并且我发现我的JFrame
是不可编辑的,除非JTextField
失去并重新获得焦点。
任何可能发生的事情以及如何解决的想法?仅在将JFrame
与JCEF组件一起使用时会发生这种情况...
每次我调用JInternalFrame
在浏览器中加载新页面时,也会发生这种情况:loadURL
再次变得不可编辑,直到我失去/获得对JTextField
的关注。 / p>
更新:
我发现了一个允许JFrame
重新变为可编辑状态的hack,但是由于它不是很好,所以我不称其为解决方案。我在JTextField
方法上用client.addLoadHandler(new CefLoadHandlerAdapter())
向CefClient实例(@Ovveride
)添加了一个加载处理程序,从而可以访问当前的浏览器组件。从那里,我可以检测到何时完成浏览器中的加载,并使用SwingUtilities获取浏览器组件所在的窗口。然后,我在该窗口上onLoadingStateChange
和setVisible(false)
。我说这不是解决方案,因为每次浏览器完成加载后,Window就会消失并重新出现。即使setVisible(true)
可以再次编辑,但看到窗口闪烁还是很丑陋的。我尝试了各种JTextField
和revalidate()
方法,但没有成功,除非我没有正确地称呼它们。
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();
}
});