如何在ImageView(JavaFX)中动态更改图像?

时间:2016-12-02 13:11:48

标签: java javafx javafx-8

我正在尝试对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);
  }
}

这是包含逻辑的演示者类:

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位于项目资源文件夹中,可以静态加载(即,如果我在初始化Image时将ImageView构造函数放入其中,则工作得很好)

1 个答案:

答案 0 :(得分:1)

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

即使在修改文本之前,也会更新图像。