Java Jcef窗口行为奇怪

Java Jcef窗口行为奇怪,java,swing,jframe,window,chromium-embedded,Java,Swing,Jframe,Window,Chromium Embedded,在我看来,这似乎是一个罕见的问题,所以我不确定我会在这里得到答案。我正在发布复制此错误的过程,希望您能够帮助我 您是否曾经尝试过在Jcef(Java Chromium Embedded Framework)示例应用程序(简单或详细)中通过执行client.createBrowser(startUrl、useOSR、isTransparent)获得的浏览器实例中执行window.open(url)来打开新窗口,并注意到奇怪的行为?每当在主窗口之外创建新窗口时,单击新窗口不会将其置于前面(或焦点)。

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

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

现在,如果我试图通过单击打开stackoveflow的窗口来将其置于前面,大约100毫秒(或更少)它保持在前面,但是主窗口“偷”回焦点并显示在其上方,就像图片中一样

您可以在Jcef中创建
大型机
实例时加载url来检查这种情况是否也发生

//inside main method
MainFrame mf = new MainFrame("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open", OS.isLinux(), false);
然后要打开一个新窗口,只需在w3schools的tryit编辑器中运行此代码,然后单击右侧的“Try it”:

<!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>

单击该按钮可打开一个新的浏览器窗口

试试看 函数myFunction(){ 窗口打开(“https://www.stackoverflow.com"); }

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

多亏了CEF论坛,我才能够解决这个问题

Windows上的焦点问题是由于
FocusParent
调用造成的

要解决此问题,请在
java\u-cef/src/native/CefBrowser\u-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
)。这个问题现在应该已经解决了