javafx HTMLEditor滚动窗格在Space Key上滚动

时间:2013-01-09 09:40:08

标签: scroll javafx html-editor

我在ScrollPane中有一个包含HTMLEditor和其他内容的VBox。

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

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

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

Scrollpane-> VBox(大于Scrollpane所以Scrollbars出现) - > 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();
        }
    }
    }
});

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题。我所做的是在使用之前将过滤后的事件直接传递给我的事件处理程序方法。对于你的情况,它看起来像这样(假设你有一个你命名为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();
    }
}

});

答案 1 :(得分:0)

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

setOnKeyPressed(event -> {
    if (event.getCode() == KeyCode.SPACE  
            || event.getCode() == KeyCode.TAB ) {
        // Consume Event before Bubbling Phase, -> otherwise Scrollpane scrolls
        event.consume();
    }
});