6

我在 ScrollPane 中有一个 VBox,其中包含一个 HTMLEditor 和其他东西。

当我每次点击空格键时在 HTMLEditor 中键入文本时,我会在编辑器中按预期得到一个空格,但 Scrollpane 也会向下滚动。首先,我通过将 EventFilter 添加到 Scrollpane 并使用 KEY_PRESSED 事件来解决此问题。但现在我需要 HTMLEditor 中的这个事件。

所以我的问题是:是否有任何标志告诉滚动窗格不要在 KeyCode.SPACE 上滚动,或者有没有办法绕过滚动窗格将输入焦点/键事件仅路由到 HTMLEditor?或者一种仅在滚动窗格上过滤此事件的方法?

您也可以使用 javafx Scene Builder 重现这一点:

Scrollpane->VBox(比 Scrollpane 大,所以出现滚动条)->2*HTMLEditor,在窗口中预览,点击空格键。


已解决:向 HTMLEditor 添加了一个 EventFilter,它使用 KEY_PRESSED 上的 KeyCode.SPACE。

htmlEditor.addEventFilter( KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
    @Override
public void handle(KeyEvent event) {

    if (event.getEventType() == KeyEvent.KEY_PRESSED){
        // Consume Event before Bubbling Phase, -> otherwise Scrollpane scrolls
        if ( event.getCode() == KeyCode.SPACE ){ 
            event.consume();
        }
    }
    }
});
4

2 回答 2

3

我刚刚遇到了类似的问题。我所做的是将过滤后的事件直接传递给我的事件处理程序方法,然后再使用它。对于您的情况,它看起来像这样(假设您有一个名为 onKeyPressed() 的 KeyEvent 处理程序方法):

htmlEditor.setOnKeyPressed(new EventHandler<KeyEvent>() {@Override public void handle(KeyEvent t) { onKeyPressed(t); }});

scrollPane.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
    if(t.getCode() == KeyCode.SPACE) {
        onKeyPressed(t);
        t.consume();
    }
}

});

于 2013-01-09T16:59:34.100 回答
0

创建您自己的扩展 HTMLEditor 的小部件并为按下的事件添加一个侦听器。

setOnKeyPressed(event -> {
    if (event.getCode() == KeyCode.SPACE  
            || event.getCode() == KeyCode.TAB ) {
        // Consume Event before Bubbling Phase, -> otherwise Scrollpane scrolls
        event.consume();
    }
});
于 2017-02-02T21:25:37.080 回答