2014-12-20 22 views
2

我一直在努力工作一小時來執行非常基本的事情。事實上,我有一個名爲Template類,持有Map<String,String>將TextField的文本綁定到某個對象(JavaFX)

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

然後我有一個名爲TemplateForm類,它是通過採取Template作爲參數構建一個JavaFX形式。它爲地圖的每個鍵創建一個字段並設置關聯的值。我希望在文本框中進行的任何更改都可以相應地更改地圖中的相關對。我知道我可以使用textProperty().bind(),但我想繼續使用完全獨立於JavaFX的類Template

我可以考慮一些封裝類,它會封裝我的地圖並提供綁定方法,但我希望在這裏定義一個簡單的更改偵聽器。然而,潛入文件後,我發現沒有什麼工作:

  • 我試圖定義onInputMethodTextChanged財產,但我的聽衆從來沒有解僱
  • 我試着設置在onKeyTyped方法使用TextField.getText價值,但在返回getText並不總是與該字段中顯示的值同步
  • 我發現TextInputControl.Content類對我來說是完美的,但受保護等)。

什麼是最好的方式做我想要的,而不需要修改Template

回答

1

嗯,這是一種愚蠢的......聽者必須加入textProperty,導致明顯的代碼(TemplateForm):

// 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 
} 
相關問題