Jcef windows表现得很奇怪

时间:2018-04-14 12:53:45

标签: java swing jframe window chromium-embedded

这在我看来是一个罕见的问题所以我不确定我会在这里得到答案。我发布了重现此错误的程序,希望您能够帮助我。

您是否尝试过在Jcef(Java-Chromium Embedded Framework)示例应用程序(简单或详细)中执行window.open(url)获取的浏览器实例中执行client.createBrowser(startUrl, useOSR, isTransparent)并注意到奇怪的行为?每当在主窗口之外创建新窗口时,单击新窗口不会将其置于前面(或聚焦)。主窗口(包含浏览器的UIComponent的JFrame)立即窃取焦点并将其他窗口发回。在下图中,w3schools的tryit编辑器在主窗口中打开,我在新窗口中打开https://stackoverflow.com

enter image description here

现在,如果我尝试通过点击将打开stackoveflow的窗口移到前面,大约100毫秒(或更短)它停留在前面,然后主窗口“偷”回焦点并显示在它上面,就像它在图片中。

您可以通过在Jcef中创建MainFrame实例时加载网址https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open来检查是否发生了这种情况。

//inside main method
MainFrame mf = new MainFrame("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open", OS.isLinux(), false);

然后打开一个新窗口,只需在w3schools的tryit编辑器中运行此代码,然后点击右侧的“试用”:

<!DOCTYPE html>
<html>
<body>

<p>Click the button to open a new browser window.</p>

<button onclick="myFunction()">Try it</button>

<script>
function myFunction() {
    window.open("https://www.stackoverflow.com");
}
</script>

</body>
</html>

我非常需要帮助。我也在CEF论坛上发布了这个问题,但没有得到维护者的任何回复。另外,我想我应该提到每次创建新窗口时都会发生这种情况,不必使用JavaScript创建。例如,如果我打开包含通过执行browser.getDevTools()获得的开发人员工具栏的JDialog,则该应用程序的行为相同。我可能在这里做一些非常愚蠢的事情,但我无法弄清楚。让我知道我做错了什么。此外,如果您尝试重现错误并发现窗口没有任何问题,请在评论中告诉我。我正在使用从Visual Studio 2015中的源代码构建的Jcef(用于CEF3的Java绑定)库。我正在运行Windows 10 64位。谢谢!

1 个答案:

答案 0 :(得分:2)

感谢CEF论坛,我能够解决这个问题。

Windows上的焦点问题归因于Java_org_cef_browser_CefBrowser_1N_N_1SetFocus中的FocusParent调用。

要解决此问题,请在java_cef/src/native/CefBrowser_N.cpp中注释掉以下内容(第1269至1278行)。

#if defined(OS_WIN)
  if (enable == JNI_FALSE) {
    HWND browserHandle = browser->GetHost()->GetWindowHandle();
    if (CefCurrentlyOn(TID_UI))
      FocusParent(browserHandle);
    else
      CefPostTask(TID_UI, base::Bind(&FocusParent, browserHandle));
  }
#endif

在Visual Studio中重建解决方案,重建java类(compile.bat win64)然后运行它(run.bat win64 Release detailed)。问题现在应该消失了。