2013-01-09 43 views
4

我有一個ScrollPane內的VBox,它包含一個HTMLEditor和其他東西。javafx HTMLEditor滾動窗格上的空格鍵滾動

當我每次點擊空格鍵時在HTMLEditor中輸入文本時,我會在編輯器中得到一個空白符,但Scrollpane也會向下滾動。首先,我通過向Scrollpane添加EventFilter並使用KEY_PRESSED事件來解決此問題。但是現在我需要在HTMLEditor中使用這個事件。

所以我的問題:是否有任何標誌告訴Scrollpane不要在KeyCode.SPACE上滾動,或者有沒有辦法將輸入焦點/關鍵事件僅路由到HTMLEditor,繞過Scrollpane?或者只有在Scrollpane上過濾此事件的方法?

您還可以重現此使用JavaFX場景生成器:

Scrollpane->垂直框(比滾動面板使滾動條出現較大) - > 2 * HTML編輯,預覽窗口中,點擊空格鍵。


解決: 加入EventFilter到HTML編輯,消耗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

我剛碰到類似的問題。我所做的就是在使用過濾事件之前將其直接傳遞給我的事件處理程序方法。對於你的情況,它會是這個樣子(假設你有()您已經命名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(); 
    } 
} 

});

+0

Thanx爲您提供幫助,但是我有兩個問題:1. ScrollPane的內容在運行時添加,更改和刪除。因此,在這種情況下,我需要類似於「KeyPressedBus」的東西,在這種情況下,我將在添加,更改,移除到Scrollpane時註冊/註銷htmlKeyPressed偵聽器,然後將事件轉發到「KeyPressedBus」,然後調用「onKeyPressed 「就像你建議的聽衆一樣。 – tobias

+0

2. Scrollpane的內容可以有超過1個HTMLEditor,所以我也必須檢查用戶在哪個編輯器中工作。爲這個小問題保留了很多開銷。我認爲這個問題必須對InputFocus做些什麼,因爲如果你用一個TextArea替換HTMLEditor,沒有問題。 TextArea的邊框顏色與它的顏色一樣,表示嘿,我得到了inputFocus。 HTMLEditor沒有這樣的顏色。 – tobias

0

創建您自己的窗口小部件,擴展HTMLEditor併爲按下的事件添加偵聽器。

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