【问题标题】:Jcef windows behaving strangeJcef窗口表现奇怪
【发布时间】:2018-04-14 12:53:45
【问题描述】:

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

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

现在,如果我尝试通过单击将打开 stackoveflow 的窗口置于前面,大约 100 毫秒(或更短)它会停留在前面,但随后主窗口会“偷走”焦点并显示在其上方,例如它在图片中。

您可以通过在 Jcef 中创建 MainFrame 实例时加载 url 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 创建。例如,如果我打开一个 JDialog,其中包含通过执行 browser.getDevTools() 获得的开发人员工具栏,则应用程序的行为相同。我可能在这里做一些非常愚蠢的事情,但我无法弄清楚。让我知道我做错了什么。另外,如果您尝试重现错误并发现 windows 没有任何问题,请在 cmets 中告诉我。我正在使用从 Visual Studio 2015 中的源代码构建的 Jcef(CEF3 的 Java 绑定)库。我正在运行 Windows 10 64 位。谢谢!

【问题讨论】:

    标签: java swing jframe window chromium-embedded


    【解决方案1】:

    感谢 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)。现在问题应该已经解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2017-03-20
      • 1970-01-01
      相关资源
      最近更新 更多