2013-01-09 4 views
4

HTMLEditor와 다른 것들이 포함 된 ScrollPane 안에 VBox가 있습니다.javafx HTMLEditor scrollpane이 스페이스 키로 스크롤

스페이스 바를 누를 때마다 HTMLEditor 안에 텍스트를 입력하면 예상대로 편집기 내부에 공백이 생기고 Scrollpane이 아래로 스크롤됩니다. 먼저 Scrollpane에 EventFilter를 추가하고 KEY_PRESSED 이벤트를 사용하여이 문제를 해결했습니다. 하지만 이제는 HTMLEditor 내부에서이 이벤트가 필요합니다.

내 질문 : Scrollpane에 KeyCode.SPACE를 스크롤하지 않도록 지시하는 플래그가 있습니까? 아니면 스크롤 포커스를 무시하고 입력 포커스/키 이벤트를 HTMLEditor로만 라우트하는 방법이 있습니까? 또는 Scrollpane에서만이 이벤트를 필터링하는 방법?

당신은 자바 FX 장면 빌더이를 재현 할 수 있습니다 :

Scrollpane-> 중 VBOX을 (스크롤이 너무 스크롤바가 표시보다 큰) -> 2 * HTML 편집기, 미리보기 창에서 스페이스 바를 누르십시오.


해결 : 추가 KEY_PRESSED에 KeyCode.SPACE을 소비하는 HTML 편집기,에 EventFilter.

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

고맙습니다 만, 다음과 같은 두 가지 문제점이 있습니다. 1. ScrollPane의 내용이 런타임에 추가, 변경 및 제거됩니다. 그래서이 경우에는 "KeyPressedBus"와 같은 것이 필요합니다. 추가/변경, Scrollpane에 대한 삭제 및 htmlKeyPressed 리스너의 등록을 취소 한 다음 이벤트를 "KeyPressedBus"로 전달하여 "onKeyPressed"를 호출합니다 "당신 같은 청취자가 제안했습니다. – tobias

+0

2. Scrollpane의 내용에는 HTMLEditor가 두 개 이상있을 수 있으므로 사용자가 작업하고있는 편집기를 확인해야합니다.이 작은 문제에 대해서는 상당한 오버 헤드가 있습니다. 나는이 문제가 InputFocus를 가지고 무엇인가를해야한다고 생각한다. 왜냐하면 HTMLEditor를 TextArea로 대체하면 문제가 없다. 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(); 
    } 
});