Панель прокрутки javafx HTMLEditor прокручивается по клавише пробела

У меня есть VBox внутри ScrollPane, который содержит HTMLEditor и другие вещи.

Когда я набираю текст внутри HTMLEditor каждый раз, когда я нажимаю пробел, я получаю пробел внутри редактора, как и ожидалось, но также прокручивается вниз. Сначала я обошел это, добавив EventFilter в панель прокрутки и используя событие KEY_PRESSED. Но теперь мне нужно это событие внутри HTMLEditor.

Итак, мой вопрос: есть ли какой-либо флаг, чтобы указать панели прокрутки не прокручивать KeyCode.SPACE или есть способ направить входные события Focus/Key только в HTMLEditor, минуя панель прокрутки? Или способ отфильтровать это событие только на панели прокрутки?

Вы также можете воспроизвести это с помощью javafx Scene Builder:

Панель прокрутки-> VBox (больше, чем панель прокрутки, поэтому появляются полосы прокрутки) -> 2 * HTMLEditor, предварительный просмотр в окне, нажмите пробел.


Решено: добавлен EventFilter в HTMLEditor, который использует KeyCode.SPACE при нажатии KEY_PRESSED.

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();
        }
    }
    }
});

person tobias    schedule 09.01.2013    source источник


Ответы (2)


Я только что столкнулся с похожей проблемой. Что я сделал, так это передал отфильтрованное событие моему методу обработчика событий непосредственно перед его использованием. В вашем случае это будет выглядеть примерно так (предположим, что у вас есть метод обработчика KeyEvent, который вы назвали onKeyPressed()):

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();
    }
}

});

person Ian Bibby    schedule 09.01.2013
comment
Спасибо за вашу помощь, но у меня есть 2 проблемы с этим: 1. содержимое ScrollPane добавляется, изменяется и удаляется во время выполнения. Итак, в этом случае мне нужно что-то вроде KeyPressedBus, на котором я буду регистрировать/отменять регистрацию прослушивателей htmlKeyPressed, когда они добавляются, изменяются, удаляются в области прокрутки, а затем пересылают событие в KeyPressedBus, который затем вызывает onKeyPressed для таких слушателей, как вы предложенный. - person tobias; 10.01.2013
comment
2. Содержимое панели прокрутки может иметь более 1 HTMLEditor, поэтому мне также нужно проверить, в каком редакторе работает пользователь. Довольно много накладных расходов для этой крошечной проблемы. Я предполагаю, что проблема связана с InputFocus, потому что, если вы замените HTMLEditor на TextArea, с этим проблем не будет. Граница TextArea окрашена так, как это указывает на то, что я получил inputFocus. HTMLEditor не имеет такой окраски. - person tobias; 10.01.2013

Создайте свой собственный виджет, который расширяет HTMLEditor, и добавьте прослушиватель для события нажатия.

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