2016-12-02 5 views
0

TextFieldの内容の妥当性チェックを実装しようとしています。妥当性を隣のアイコンとして表示しています。しかし、それはイメージを変更するようではありません。ここに私が今までに持っているコードがあります。私は経験している問題に関係のないものはすべて取り除きました。ここで ImageView(JavaFX)でイメージを動的に変更するにはどうすればよいですか?

は、ビュークラスです:

package mypackage.view; 

import mypackage.model.Foo; 

// JavaFX imports 

public class MyView extends VBox { 

    private final Foo model; 
    private final MyPresenter presenter; 

    HBox tokenValidationbox; 
    TextField tokentxt; 
    ImageView isValidimg; 

    public MyView(Foo model) { 
    this.model = model; 

    initFieldData(); 
    layoutForm(); 

    this.presenter = new MyPresenter(model, this); 
    } 

    private void initFieldData() { 
    tokenValidationbox = new HBox(); 
    tokentxt = new TextField(); 
    isValidimg = new ImageView(); 
    } 

    private void layoutForm() { 
    tokenValidationbox.getChildren().addAll(tokentxt, isValidimg); 
    this.getChildren().add(tokenValidationbox); 
    } 
} 

そして、これはロジックが含まれているプレゼンタークラスです:

package mypackage.view; 

import mypackage.model.Foo; 

// JavaFX imports 

public class MyPresenter { 

    private final Foo model; 
    private final MyView view; 

    public MyPresenter(Foo model, MyView view) { 
    this.model = model; 
    this.view = view; 

    attachEvents(); 
    } 

    private void attachEvents() { 
    view.tokentxt.setOnAction((ActionEvent event) -> { 
     view.isValidimg.setImage(new Image(validationImage(view.tokentxt.getText()))) 
    }); 
    } 

    public String validationImage(String token) { 
    String img = "dialog-error.png"; 
    if(isValid(token)) img = "emblem-default.png"; 
    return getClass().getClassLoader().getResource(img).toExternalForm(); 
    } 

    private static boolean isValid(String token) { 
    // snip 
    } 
} 

私は、これは何かが変更されるたびに入力されたトークンが有効であるかどうかを確認する必要があります理解したようテキストフィールドに入力し、対応するイメージをロードして表示しますが、イメージは表示されません。

emblem-default.pngdialog-error.pngプロジェクトリソースフォルダに置かれており、静的にロードすることができます(私はImageViewImageコンストラクタを置けば、それを初期化するとき、すなわち、それだけで正常に動作します)

+0

'onAction'ハンドラは' enter'を押すと呼び出されます( 'TextField'で何かが変更された場合は*です)。さらに、毎回新しいイメージを作成/ロードするのではなく、一度にイメージをロードすることをお勧めします。 – fabian

+0

グリーンに変わり、有効と言われるテキストを使用するだけではどうですか? – Sedrick

+0

答える前に完全なシナリオを読む必要があります。ごめんなさい。 – Sedrick

答えて

1

textプロパティにChangeListenerを追加代わりに。 と入力すると、onActionがトリガーされます。

は、さらに私は、画像を毎回再作成しないことをお勧めします:

private static final Image VALID_IMG = new Image(MyPresenter.class.getClassLoader().getResource("emblem-default.png").toExternalForm()); 
private static final Image INVALID_IMG = new Image(MyPresenter.class.getClassLoader().getResource("dialog-error.png").toExternalForm()); 

public Image validationImage(String token) { 
    return isValid(token) ? VALID_IMG : INVALID_IMG; 
} 

view.tokentxt.textProperty().addListener((observable, oldValue, newValue) -> { 
    view.isValidimg.setImage(validationImage(newValue)); 
}); 

あなたはまた、このためBindingを使用することができます。テキストが変更されていても前の画像を更新してしまう

view.isValidating.imageProperty().bind(Bindings.createObjectBinding(() -> validationImage(view.tokentxt.getText()), view.tokentxt.textProperty())); 

関連する問題