【问题标题】:javafx HTMLEditor scrollpane scrolls on Space Keyjavafx HTMLEditor 滚动窗格在空格键上滚动
【发布时间】:2013-01-09 09:40:08
【问题描述】:

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

【问题讨论】:

    标签: scroll javafx html-editor


    【解决方案1】:

    我刚刚遇到了类似的问题。我所做的是在使用过滤后的事件之前直接将其传递给我的事件处理程序方法。对于您的情况,它看起来像这样(假设您有一个名为 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. ScrollPane 的内容在运行时添加、更改和删除。因此,在这种情况下,我需要类似“KeyPressedBus”之类的东西,当它们被添加、更改、删​​除到 Scrollpane 时,我将在其上注册/注销 htmlKeyPressed 侦听器,然后将事件转发到“KeyPressedBus”,然后调用“onKeyPressed " 在你建议的听众身上。
    • 2. Scrollpane 的内容可以有超过 1 个 HTMLEditor,所以我还必须检查用户正在使用哪个编辑器。这个小问题的开销非常大。我认为问题与 InputFocus 有关,因为如果您将 HTMLEditor 替换为 TextArea,则没有问题。 TextArea 的边框是彩色的,就像它表示嘿我得到了 inputFocus。 HTMLEditor 没有这种颜色。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多