gpt4 book ai didi

javafx - 是否可以将 StringProperty 绑定(bind)到 JavaFX 中的 POJO 字符串?

转载 作者:行者123 更新时间:2023-12-01 01:02:26 24 4
gpt4 key购买 nike

我正在使用 JavaFX 2 创建一个应用程序。
我打算将 UI 与数据和逻辑隔离开来。考虑到这一点,我有很多这样的数据对象:

public class Entity {
private String m_Value;
public Entity(String value) { m_Value = value; }
public String getValue() { return m_Value; }
public void setValue(String value) { m_Value = value; }
}

例如,我很难在 m_Value 属性和 Label 的 textProperty 之间创建绑定(bind)。

这里的另一个类似问题建议人们使用 JFXtras,但是我不确定我是否可以使用它(公司限制)。所以我试图找到一些替代方案。

我的想法是使用对象来表示我的数据实体的所有属性,而不是原始类型(int 将使用 Integer 等)。这样,我可以利用 java 的引用模型传递。
然后,在 UI 域中,​​我可以创建一个引用该属性的属性。但我不确定这是否可能。

使用 ObjectProperty 类可以解决这个问题吗?

另一种选择是使用 JavaBeanProperty 系列类,如 JavaBeanStringPropertyBuilder、JavaBeanIntegerPropertyBuilder。是否可以?

我已经尝试了两种方法,但我害怕我在 JavaFX 方面没有那么有经验来解决这个问题。
任何人都可以帮忙吗?

我不想在我的数据对象中使用 StringProperty 或 IntegerProperty,因为我不希望这个包中有任何 JavaFX 依赖项。
这个应用程序很有可能成为一个 Eclipse 插件,并且 JavaFX 可能会被关闭。这样我可以避免将来过多的返工。

非常感谢。

最佳答案

除了在 JavaFX 中使用监听器之外,您显然可以在 Entity 中设置值而无需执行任何操作。如果你想走另一条路,你可以添加java.beans.PropertyChangeSupport.它不在 javafx 包中。

package bindpojo;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class BindPojo extends Application {
StringProperty fxString = new SimpleStringProperty();
StringProperty tmpString = new SimpleStringProperty();

@Override
public void start(Stage primaryStage) {
VBox vbox = new VBox();
TextField text = new TextField();
Label label1 = new Label();
Label label2 = new Label();
Entity entity = new Entity("");
vbox.getChildren().addAll(text,label1,label2);
Scene scene = new Scene(vbox, 300, 200);
primaryStage.setScene(scene);
primaryStage.show();

fxString.bindBidirectional(text.textProperty());

fxString.addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
entity.setValue(newValue);
label1.setText(entity.getValue());
}
});

entity.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
tmpString.set(evt.getNewValue().toString());
}
});

label2.textProperty().bind(tmpString);
}

public class Entity {
private String m_Value;
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public Entity(String value) { m_Value = value; }
public String getValue() { return m_Value; }
public void setValue(String value) {
pcs.firePropertyChange("m_Value", m_Value, value);
m_Value = value;
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
}
}

您实际上并不需要 tmpString,我只是使用它以防您想让 Entity 类似于 javafx 字符串属性。您可以只在属性更改监听器中设置标签,而不是设置字符串属性然后绑定(bind)到它。

关于javafx - 是否可以将 StringProperty 绑定(bind)到 JavaFX 中的 POJO 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22105162/

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