みんなでGOLF

golf(http://golf.sandbox.seasar.org/)、バリデーションが便利なのでそのためだけに実案件で投入中。

JTextFieldのバリデーションなんですが、フォーカスを失わないとValueModelに値が反映されないようになってまして。

最初の内は不都合無かったんですが、ファンクションキーを使えるようにするとこれがちょいと面倒な事に。

F9で登録、なんて場合、必須項目に入力し終わった時点でF9押しても「入力して下さい」と出る。F9押した時に無理やりフォーカス移動しても間に合わないみたい。

逆に、一度入力してフォーカス移動してValueModelに反映した後、入力した値を消してそのまま動かずにF9を押すと、必須チェックされない。

さてどうしたもんかと思って色々みたら、FormBindingManager#Bindの中で呼んでるBindings#bindの第4引数がbooleanで、これがtrueだとフォーカスをロストした時にValueModelにコミットされる模様。

public class FormBindingManager implements PropertyChangeListener, ComponentValidator  {
(中略)
    public void Bind(JComponent jc, ValueModel vm, Object choice) {
(中略)
       else if (jc instanceof JTextField) {            
         //Bindings.bind((JTextField)jc, vm, ((JTextField)jc).getDocument()  , true);
         Bindings.bind((JTextField)jc, vm, ((JTextField)jc).getDocument()  , false);//これを変えた
      }

そしたらちゃんとF9でもチェックされるようになった。やったー。

多分これだと、編集時でのリアルタイムのバリデーションが出来なくなるんじゃないかと。でも今回はボタン押下のタイミングに限定したのでこれでいいのかな、と。