当前位置: 首页 > 知识库问答 >
问题:

Jcef窗口行为奇怪

裴楚青
2023-03-14

这在我看来是一个罕见的问题,所以我不确定我会得到一个答案。我张贴的程序重现这个错误,希望你能帮助我。

您有没有尝试过在Jcef(Java-铬嵌入式框架)示例应用程序(简单或详细)中通过做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编辑器中运行这段代码,然后单击右侧的“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>

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

共有1个答案

虞裕
2023-03-14

多亏了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)。这个问题现在应该已经没有了。

 类似资料:
  • 我很难理解Istio网关端口到底是如何使用的。我指的是下面例子中的第14行 从Istio文档中: 代理应在其上侦听传入连接的端口。因此,如果您应用上面的yaml文件并检查istio-ingress网关pod以监听TCP端口,您会发现实际上使用了端口8169(见下面的输出) 但棘手的部分来了。如果在应用Gateway之前更改istio-ingress网关服务如下: 然后应用网关,实际使用的端口不是8

  • 问题内容: 在问另一个问题时,我发现SQL Server(在2005年和2008年同时发生)在处理窗口函数子句中的语句时似乎有奇怪的不一致行为。以下代码给出了一个错误: 错误是 窗口函数不支持将常量用作ORDER BY子句表达式。 我认为这是因为该语句的计算结果可能为,这是一个常量。也可能像预期的那样,此代码给出了相同的错误: …大概是出于同样的原因。但是,此代码不会给出错误: 与第一个代码块的唯

  • 有人知道这个黑色矩形是什么吗?这是我的主要任务。py: 这是我的马里奥。py: 最后,我的levels.py: 我使用的是Windows10计算机,python版本为3.8。3和pygame版本1.9。6.

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处