2016-12-02 932 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位於項目資源文件夾,可以靜態加載(即,如果我當初始化時,它把ImageView內的Image構造函數,它工作得很好)

+0

當您按下'enter'鍵時,'onAction'處理程序會被調用(如果'TextField'中的內容發生了變化,*這就是*的意思)* ???)。此外,我建議最多一次加載圖像,而不是每次創建/加載新圖像。 – fabian

+0

爲什麼不使用改變爲綠色的文本並說有效。 – Sedrick

+0

我在回答之前需要閱讀完整的場景。抱歉。 – Sedrick

回答

1

添加ChangeListenertext財產代替。 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())); 

這將更新文本進行修改,甚至之前的圖像。