gpt4 book ai didi

从 SWT 3 切换到 SWT 4 时,JAVA SWT KeyDown 事件触发了 3 次而不是 1 次

转载 作者:行者123 更新时间:2023-12-01 22:07:36 28 4
gpt4 key购买 nike

以下问题让我感到困惑:我有一个 SWT Java 应用程序,并且在以下情况下从 SWT 3 切换到 SWT 4 会导致 KeyDown 事件出现奇怪的行为:

我有一个包含浏览器小部件的外壳。我正在通过 Display 对象上的过滤器在 Java 级别监听 KeyDown 事件,如下所示。当检测到此类事件时,我会调用浏览器小部件的execute() 函数来执行一些javascript。我选择在全局 java 级别检测 KeyDown 事件,而不是直接在 javascript 中检测,因为浏览器此时不一定具有焦点。

预期行为:KeyDown 事件应该被检测一次

实际行为:检测到 KeyDown 事件三次

到目前为止我尝试过并学到的东西:1) 该问题仅在使用浏览器小部件时发生。2)这个问题不仅发生在执行一些javascript时,如果我简单地设置浏览器的内容(br.setText(“...”))也会发生这个问题,所以看起来浏览器上的任何操作都会触发问题。3) SWT 3.836 不会出现此问题。 SWT 4.924 会发生这种情况

恢复到 SWT 3 并不是一个理想的选择,因为它由于 libwebkitgtk 导致了很多崩溃,并且我用 SWT 4 摆脱了那些崩溃......

配置:Ubuntu 18.04、Java openjdk 11 adm64、SWT 4.924(从Eclipse下载页面下载最新稳定版本4.14M1)

这是代码:

public static void main(String[] args) {
System.out.println("Launching test application");

Display display = new Display();
Shell shell = new Shell(display);

Browser br = new Browser(shell,SWT.NONE);
br.setSize(500,500);

display.addFilter(SWT.KeyDown, new Listener() {

@Override
public void handleEvent(Event event) {
System.out.println(event.keyCode);
//Try either of the following two lines to reproduce the problem. If you comment both lines, the problem disappears
br.execute("javascript:alert('hello')");
//br.setText("<html><head></head><body>TEST</body></html>");
}
});

shell.open();

while (!shell.isDisposed()) {
if (!display.readAndDispatch())
{
display.sleep();
}
}
}

有什么提示吗?提前致谢!

最佳答案

我已经在 Windows 10 和 SWT 4.924 上测试了您的代码,并且收到了该事件 2 次。

我的猜测是,浏览器还与导致多个事件的过滤器交互(请参阅此旧评论,不确定是否相关:https://bugs.eclipse.org/bugs/show_bug.cgi?id=69919#c8)。

此外,似乎只有当浏览器获得焦点时才会出现该问题,并且当其他控件获得焦点时该问题也能正常工作。

因此,作为解决方法,您可以在浏览器没有焦点时使用过滤器,否则在浏览器获得焦点时使用浏览器上的标准按键监听器。

例如:

br.addKeyListener(keyPressedAdapter(event -> {
handleBrowserKeyEvent(br, event.keyCode);
}));

display.addFilter(SWT.KeyDown, new Listener() {
@Override
public void handleEvent(Event event) {
// when the browser has focus, use his key listener instead of this filter
if (br.isFocusControl()) {
return;
}
handleBrowserKeyEvent(br, event.keyCode);
}
});

handleBrowserKeyEvent 中放置处理逻辑的位置。

请注意,在我的例子中,我还必须在 shell.open(); 之后放置一个 shell.forceFocus();,否则浏览器按键监听器将不会立即工作(我不知道为什么)。

关于从 SWT 3 切换到 SWT 4 时,JAVA SWT KeyDown 事件触发了 3 次而不是 1 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680034/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com