gpt4 book ai didi

java - 如何动态更改 ImageView (JavaFX) 中的图像?

转载 作者:行者123 更新时间:2023-12-01 09:10:49 25 4
gpt4 key购买 nike

我正在尝试对 TextField 的内容实现验证检查,将有效性显示为旁边的图标。但它似乎并没有改变形象。这是我到目前为止的代码,我删除了与我遇到的问题无关的任何内容。

这是 View 类:

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

据我了解,每当文本字段中的内容发生更改时,应该检查输入的 token 是否有效,然后加载相应的图像进行显示,但是图像没有显示。

emblem-default.pngdialog-error.png 位于项目资源文件夹中,可以静态加载(即,如果我放置 Image初始化时,在 ImageView 中使用 构造函数,它工作得很好)

最佳答案

ChangeListener 添加到 text 属性中。 onAction 仅在按下 Enter 或类似操作时触发。

此外,我建议不要每次都重新创建图像:

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

这甚至会在修改文本之前更新图像。

关于java - 如何动态更改 ImageView (JavaFX) 中的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40933045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com