2016-06-27 2 views
2

저는 TextField을 가지고 있으며, 대부분의 시스템에서 예상되는 동작 인 Esc을 누르면 해당 필드의 내용을 이전 값으로 복원하고 싶습니다. 왜 JavaFX 기본적으로이 작업을 수행하지 않습니다).JavaFX TextField cancelEdit가 예상대로 작동하지 않습니다.

이 목적으로 TextField.cancelEdit()을 사용하려고 시도했지만 아무 것도하지 않는 것처럼 보입니다. 여기

이 단계 재현하는 SSCCE

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.scene.input.KeyCode; 
import javafx.stage.Stage; 

public class UiTest2Controller extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage aPrimaryStage) throws Exception { 
     final TextField field = new TextField(); 
     field.setOnAction(aEvent -> { 
      System.out.println("Action"); 
     }); 
     field.setOnKeyPressed(aEvent -> { 
      if (aEvent.getCode() == KeyCode.ESCAPE) { 
       System.out.println("Escape"); 
       field.cancelEdit(); 
       field.getParent().requestFocus(); 
      } 
     }); 
     field.setPromptText("Hello World..."); 

     aPrimaryStage.setScene(new Scene(new Group(field))); 
     aPrimaryStage.show(); 
    } 
} 

입니다 :

  1. 유형 뭔가를 텍스트 필드에
  2. 를 눌러 Esc를

예상되는 동작 : 필드가 이전 값으로 돌아가고 (처음 비어 있음) 초점이 손실됩니다.

실제 동작 : fiels는 해당 시점의 값을 유지하고 초점이 손실됩니다.

답변

4

나는 세부 사항에 대해 잘 모르겠지만, TextField가있는 경우 예상대로 작동하는 것 같다 TextFormatter 할당 :

field.setTextFormatter(new TextFormatter<>(TextFormatter.IDENTITY_STRING_CONVERTER)); 
+0

예, 난 그냥 자바 FX 소스에서 보면이를 발견했다. 너무 낮게 문서화되어 있습니다 ... 또한 텍스트 포맷터 세트로 Escape는 기본적으로 편집을 취소합니다. –

+0

게다가 field.commitValue()를 호출하여 "복원 지점"을 만들 수 있습니다. 그렇지 않으면 항상 값을 빈 문자열로 롤백합니다. – DVarga

+1

'TextFormatter'없이'field.commitValue()'를 호출해도 결과에 아무런 영향을 미치지 않습니다. 'TextFormatter'을 사용하면'commitValue'를 호출하지 않고도 예상대로 작동하므로 필요한지 확실하지 않습니다. – Itai

관련 문제