2014-03-02 4 views
2

저는 JavaFX 세계에 상당히 익숙하지 않아 텍스트 - 수정 이벤트를 수신하는 방법을 알아낼 수 없습니다. HTMLEditor 구성 요소.JavaFX HTMLEditor 텍스트 변경 리스너

이 위젯을 업데이트해야하는 모델에 연결하고 있기 때문에 필자가 필요합니다.

KeyEvent.KEY_TYPED 이벤트 유형이있는 addEventFilter API가 제대로 작동하지 않는 것 같습니다. 처리기가 호출 될 때 getHTMLText()은 아직 최신 문자로 업데이트되지 않습니다. 누군가이 단락을 이해하지 못하면 단계별 예제를 제공합니다.

TextField에는 청취자를 연결할 수있는 textProperty()이 있습니다.
이제 HTMLEditor은 어떻게됩니까?

또한, 텍스트 만 호출 수신기 (예를 들어, CTRL + 을과하지 않음) 이벤트를 수정해야 좋을 것이다. 아시다시피 ... SWT Text의 addModifyListener()처럼.

답변

2

내 프로젝트 응용 프로그램 중 하나에서 JavaFX HTMLEditor을 사용하는 동안 비슷한 상황에 직면했습니다. 나는 button을 추가하면서 HTML 텍스트의 파싱이 일어날 것입니다. 그리고 추가 작업이 실행되었습니다. AnchorPane을 사용하여 button을 HTMLEditor에 완벽하게 추가 할 수 있었고 일부만 보였습니다.

어쨌든, 여기에 당신이 어떤 추가 버튼없이 당신이 원하는 것을 달성 할 수있는 방법에 대한 약간의 예는 다음과 같습니다

package application; 

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.web.HTMLEditor; 
import javafx.stage.Stage; 

public class Main extends Application 
{ 
    @Override 
    public void start(Stage primaryStage) 
    { 
    try 
    { 
     final HTMLEditor editor = new HTMLEditor(); 
     Scene scene = new Scene(editor); 
     primaryStage.setScene(scene); 

     editor.setOnKeyReleased(new EventHandler<KeyEvent>() 
     { 
     @Override 
     public void handle(KeyEvent event) 
     { 
      if (isValidEvent(event)) 
      { 
      System.out.println(editor.getHtmlText()); 
      } 
     } 

     private boolean isValidEvent(KeyEvent event) 
     { 
      return !isSelectAllEvent(event) 
       && ((isPasteEvent(event)) || isCharacterKeyReleased(event)); 
     } 

     private boolean isSelectAllEvent(KeyEvent event) 
     { 
      return event.isShortcutDown() && event.getCode() == KeyCode.A; 
     } 

     private boolean isPasteEvent(KeyEvent event) 
     { 
      return event.isShortcutDown() && event.getCode() == KeyCode.V; 
     } 

     private boolean isCharacterKeyReleased(KeyEvent event) 
     { 
      // Make custom changes here.. 
      switch (event.getCode()) 
      { 
      case ALT: 
      case COMMAND: 
      case CONTROL: 
      case SHIFT: 
       return false; 
      default: 
       return true; 
      } 
     } 
     }); 

     primaryStage.show(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 

    public static void main(String[] args) 
    { 
    launch(args); 
    } 
} 

UPDATE : 생각의 조금 더시 은, 난 할 이벤트 처리를 얻을 수있는 방법을 발견 버튼 클릭시. 당신이 HTMLEditor가 표시되면 두 ToolBars있다

EventHandler<MouseEvent> onMouseExitedHandler = new EventHandler<MouseEvent>() 
{ 
    @Override 
    public void handle(MouseEvent event) 
    { 
    System.out.println(editor.getHtmlText()); 
    } 
}; 

for (Node node : editor.lookupAll("ToolBar")) 
{ 
    node.setOnMouseExited(onMouseExitedHandler); 
} 

: 방법은 다음과.
코드에서 수행중인 작업은 두 도구 모음에 대해 looking up이고 onMouseExited 이벤트 처리기를 설정하는 것입니다. 사용자가 HTML 텍스트를 입력하고 변경하여 툴바를 종료하면 이벤트가 처리되어 처리 될 수 있다는 유추가 있습니다.

필요에 따라이 두 도구 모음에서 다른 종류의 이벤트 처리기를 설정할 수도 있지만, 내 생각에이 onMouseExited 이벤트 처리기는 onKeyReleased 이벤트 처리기와 함께 사용할 때 매우 광범위한 적용 범위를 제공합니다. onMouseExited 처리기를 기반으로 한 적용 범위는 정확하지 않습니다. 여기

+0

무엇에 대한 복사 - 붙여 넣기입니까? :-( – GGrec

+0

@GGrec : 이벤트를 잘라내어 붙여 넣기에 대한 답변을 업데이트했으며, 사용자의 필요에 따라이 저수준 키 리스너를 구성 할만큼 똑똑하다고 확신합니다. –

+0

오,이 사람은 예를 들어 마우스를 사용하여 텍스트를 선택한 다음 굵은 글씨로 바꾼다 모델이 변경되어야하지만 형식 이벤트가 아님 – GGrec

1

는 간단한

public class HtmlEditorListener { 
    private final BooleanProperty editedProperty; 

    private String htmlRef; 

    public HtmlEditorListener(final HTMLEditor editor) { 
     editedProperty = new SimpleBooleanProperty(); 
     editedProperty.addListener((ov, o, n) -> htmlRef = n? null: editor.getHtmlText()); 
     editedProperty.set(false); 

     editor.setOnMouseClicked(e -> checkEdition(editor.getHtmlText())); 
     editor.addEventFilter(KeyEvent.KEY_TYPED, e -> checkEdition(editor.getHtmlText())); 
    } 

    public BooleanProperty editedProperty() { 
     return editedProperty; 
    } 

    private void checkEdition(final String html) { 
     if (editedProperty.get()) { 
      return; 
     } 
     editedProperty.set(htmlRef != null 
       && html.length() != htmlRef.length() 
       || !html.equals(htmlRef)); 
    } 
}