在 JInternalFrame 中使用 JCEF 时,JFrame 中的 JTextField 不可编辑,直到 JFrame 失去焦点
JTextField in JFrame uneditable when using JCEF in JInternalFrame until JFrame loses focus
我已经开始在我的一个项目中实施 JCEF,并且我正在 JFrame
中的 JInternalFrame
中初始化嵌入式浏览器,以及一系列表单字段JInternalFrame
旁边的 JPanel
。浏览器组件在 JFrame
真正可见之前不会完全初始化,我发现我的 JTextField
是不可编辑的,除非 JFrame
失去并重新获得焦点。
知道会发生什么以及如何解决吗?这仅在将 JInternalFrame
与 JCEF 组件一起使用时发生...
每次我调用 loadURL
在浏览器中加载新页面时也会发生这种情况:JTextField
再次变得不可编辑,直到我 lose/gain 将焦点放在 JFrame
.
更新:
我发现了一个 hack,它允许 JTextField
s 再次变得可编辑,但我不会将其称为解决方案,因为它不是很优雅。我在 onLoadingStateChange
方法上使用 @Ovveride
向 CefClient 实例 ( client.addLoadHandler(new CefLoadHandlerAdapter())
) 添加了一个负载处理程序,这反过来又提供了对当前浏览器组件的访问权限。从那里我可以检测浏览器加载何时完成,并使用 SwingUtilities 获取浏览器组件所在的 Window。然后我 setVisible(false)
和 setVisible(true)
Window.我说这不是解决方案,因为每次浏览器完成加载时 Window 都会消失并重新出现。尽管 JTextField
又可以编辑了,但看到 window 闪烁还是很丑陋的。我试了各种revalidate()
和repaint()
方法都无济于事,除非我没有正确调用它们...
client.addLoadHandler(new CefLoadHandlerAdapter() {
@Override
public void onLoadingStateChange(CefBrowser browser, boolean isLoading,
boolean canGoBack, boolean canGoForward) {
if (!isLoading) {
//browser_ready = true;
System.out.println("Browser has finished loading!");
SwingUtilities.windowForComponent( browser.getUIComponent() ).setVisible(false);
SwingUtilities.windowForComponent( browser.getUIComponent() ).setVisible(true);
}
}
});
如果有人可以提出更好的解决方案,请提出!
我通过更好地研究示例 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();
}
});
我已经开始在我的一个项目中实施 JCEF,并且我正在 JFrame
中的 JInternalFrame
中初始化嵌入式浏览器,以及一系列表单字段JInternalFrame
旁边的 JPanel
。浏览器组件在 JFrame
真正可见之前不会完全初始化,我发现我的 JTextField
是不可编辑的,除非 JFrame
失去并重新获得焦点。
知道会发生什么以及如何解决吗?这仅在将 JInternalFrame
与 JCEF 组件一起使用时发生...
每次我调用 loadURL
在浏览器中加载新页面时也会发生这种情况:JTextField
再次变得不可编辑,直到我 lose/gain 将焦点放在 JFrame
.
更新:
我发现了一个 hack,它允许 JTextField
s 再次变得可编辑,但我不会将其称为解决方案,因为它不是很优雅。我在 onLoadingStateChange
方法上使用 @Ovveride
向 CefClient 实例 ( client.addLoadHandler(new CefLoadHandlerAdapter())
) 添加了一个负载处理程序,这反过来又提供了对当前浏览器组件的访问权限。从那里我可以检测浏览器加载何时完成,并使用 SwingUtilities 获取浏览器组件所在的 Window。然后我 setVisible(false)
和 setVisible(true)
Window.我说这不是解决方案,因为每次浏览器完成加载时 Window 都会消失并重新出现。尽管 JTextField
又可以编辑了,但看到 window 闪烁还是很丑陋的。我试了各种revalidate()
和repaint()
方法都无济于事,除非我没有正确调用它们...
client.addLoadHandler(new CefLoadHandlerAdapter() {
@Override
public void onLoadingStateChange(CefBrowser browser, boolean isLoading,
boolean canGoBack, boolean canGoForward) {
if (!isLoading) {
//browser_ready = true;
System.out.println("Browser has finished loading!");
SwingUtilities.windowForComponent( browser.getUIComponent() ).setVisible(false);
SwingUtilities.windowForComponent( browser.getUIComponent() ).setVisible(true);
}
}
});
如果有人可以提出更好的解决方案,请提出!
我通过更好地研究示例 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();
}
});