2014-12-20 5 views
2

저는 매우 기본적인 것을 수행하기 위해 한 시간 동안 고심하고 있습니다.TextField의 텍스트를 일부 객체 (JavaFX)에 바인딩

public class Template extends AbstractLateXElement { 
    protected final Map<String, String> parameters = new HashMap<>(); 
    // many unrelevant code 
} 

내가 다음 매개 변수로 Template을 복용하여 구성된 자바 FX의 형태 TemplateForm라는 클래스가 : 사실, 나는 Map<String,String>을 보유하고 Template라는 클래스가 있습니다. 맵의 각 키에 대해 하나의 필드를 작성하고 연관된 값을 설정합니다. 텍스트 필드에서 행해진 모든 변경 사항을지도의 관련 쌍을 적절하게 변경하고 싶습니다. 내가 textProperty().bind()을 사용할 수 있다는 것을 알고 있지만, Template 클래스를 완전히 JavaFX 독립적으로 유지하고 싶습니다.

맵을 랩핑하고 바인딩 메소드를 제공하는 랩퍼 클래스에 대해 생각해 볼 수 있지만, 여기서는 선호하는 간단한 변경 리스너를 정의합니다. 그러나, 문서에 다이빙 후 나는 일을 아무것도 찾을 수 없습니다 : 나는 onInputMethodTextChanged 속성을 정의하는 시도

  • 을하지만 내 청취자는 내가 onKeyTyped 방법에 TextField.getText를 사용하여 값을 설정하려고
  • 를 해고하지 않지만 의해 반환 않았다 getText은 항상 필드에 표시된 값과 동기화되지 않습니다.
  • TextInputControl.Content 클래스는 나를 위해 완벽하지만 보호되는 클래스를 찾았습니다.)

Template을 수정하지 않고 원하는 것을 수행하는 가장 좋은 방법은 무엇입니까?

답변

1

음, 즉 종류의 바보 ... 리스너 (TemplateForm에) 명백한 코드의 결과로, textProperty에 추가 할 수 있습니다

// t is an instance of Template 
final Map<String,String>   params = t.getParameters(); 
Iterator<Map.Entry<String,String>> it  = params.entrySet().iterator(); 

Map.Entry<String,String> param; 
int i; 
for (i=0, param = it.hasNext() ? it.next() : null ; param != null ; i++, param = it.hasNext() ? it.next() : null) { 
    Label  label = new Label(); 
    TextField field = new TextField(param.getValue()); 

    final String key = param.getKey(); 
    field.textProperty().addListener((ObservableValue<? extends String> obs, String oldValue, String newValue) -> params.put(key,newValue)); 
    // unrelevant code 
}