簡體   English   中英

如何動態更改ImageView(JavaFX)中的圖像?

[英]How do I dynamically change the image in an ImageView (JavaFX)?

我正在嘗試對TextField的內容實施驗證檢查,將有效性顯示為旁邊的圖標。 但是,它似乎並沒有改變圖像。 這是我到目前為止的代碼,我刪除了與遇到的問題無關的所有內容。

這是視圖類:

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);
  }
}

這是presenter類,其中包含以下邏輯:

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
  }
}

據我了解,每當在文本字段中進行更改時,都應檢查輸入的令牌是否有效,然后加載要顯示的相應圖像,但是該圖像未顯示。

dialog-error.png emblem-default.pngdialog-error.png位於項目資源文件夾中,可以靜態加載(即,如果在初始化時將Image構造函數放在ImageView ,則可以正常工作)

而是將ChangeListener添加到text屬性。 僅在按下Enter鍵或類似操作時才觸發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()));

即使在修改文本之前,它也會更新圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM