Scroll javafx HTMLEditor滚动窗格按空格键滚动

Scroll javafx HTMLEditor滚动窗格按空格键滚动,scroll,javafx,html-editor,Scroll,Javafx,Html Editor,我在滚动窗格中有一个VBox,其中包含HTMLEditor和其他内容 每次点击空格键时,当我在HTMLEditor中键入文本时,编辑器中会出现预期的空白,但滚动窗格也会向下滚动。首先,我通过在滚动窗格中添加一个EventFilter来解决这个问题,并使用按键事件。但是现在我需要在HTMLEditor中使用这个事件 所以我的问题是:有没有任何标志告诉滚动窗格不要在KeyCode.SPACE上滚动,或者有没有一种方法可以绕过滚动窗格,只将输入焦点/键事件路由到HTMLEditor?还是只在滚动窗格上

我在滚动窗格中有一个VBox,其中包含HTMLEditor和其他内容

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

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

您也可以使用javafx场景生成器再现此场景:

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


已解决: 在HTMLEditor中添加了一个EventFilter,它会使用按键上的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();
        }
    }
    }
});
htmlEditor.addEventFilter(按下KeyEvent.KEY\u,新建EventHandler()){
@凌驾
公共无效句柄(KeyEvent事件){
if(event.getEventType()==KeyEvent.KEY\u按下){
//在冒泡阶段之前使用事件,->否则滚动窗格
如果(event.getCode()==KeyCode.SPACE){
event.consume();
}
}
}
});

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

htmlEditor.setOnKeyPressed(neweventhandler(){@Override public void handle(KeyEvent){onKeyPressed(t);}});
scrollPane.addEventFilter(按下KeyEvent.KEY_,新建EventHandler()){
@凌驾
公共无效句柄(KeyEvent t){
if(t.getCode()==KeyCode.SPACE){
按ON键(t);
t、 消费();
}
}

}))

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

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

谢谢你的帮助,但我有两个问题:1。滚动窗格的内容在运行时添加、更改和删除。因此,在这种情况下,我需要一个类似于“KeyPressedBus”的东西,当htmlKeyPressed侦听器被添加、更改、删除到滚动窗格时,我会在其上注册/取消注册它们,然后将事件转发到“KeyPressedBus”,该“KeyPressedBus”按照您的建议在侦听器上调用“onKeyPressed”。Scrollpane的内容可以有不止一个HTMLEditor,因此我还必须检查用户使用的编辑器。对于这个小问题来说,开销相当大。我假设这个问题与InputFocus有关,因为如果用TextArea替换HTMLEditor,那么这个问题就没有了。文本区域的边框是彩色的,表示我得到了inputFocus。HTMLEditor没有这种颜色。
setOnKeyPressed(event -> {
    if (event.getCode() == KeyCode.SPACE  
            || event.getCode() == KeyCode.TAB ) {
        // Consume Event before Bubbling Phase, -> otherwise Scrollpane scrolls
        event.consume();
    }
});