6

HTMLEditor などを含む ScrollPane 内に VBox があります。

スペース バーを押すたびに HTMLEditor 内にテキストを入力すると、期待どおりにエディター内に空白が表示されますが、Scrollpane も下にスクロールします。まず、EventFilter を Scrollpane に追加し、KEY_PRESSED イベントを消費することで、これを回避しました。しかし今、HTMLEditor 内でこのイベントが必要です。

だから私の質問: Scrollpane に KeyCode.SPACE でスクロールしないように指示するフラグはありますか、または Scrollpane をバイパスして入力フォーカス/キー イベントを HTMLEditor のみにルーティングする方法はありますか? または、このイベントを Scrollpane でのみフィルタリングする方法はありますか?

これは javafx Scene Builder でも再現できます。

Scrollpane->VBox (Scrollpane よりも大きいため、スクロールバーが表示されます)->2*HTMLEditor、ウィンドウでプレビュー、スペース バーを押します。


解決済み: KEY_PRESSED で KeyCode.SPACE を消費する EventFilter を HTMLEditor に追加しました。

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 に答える