是否可以将StringProperty绑定到JavaFX中的POJO字符串?

时间:2014-02-28 20:27:29

标签: javafx pojo

我正在使用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之间创建绑定。

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

我的想法是使用对象来表示我的数据实体的所有属性,而不是基本类型(int将使用Integer等)。这样,我可以利用java的pass by reference模型。 然后,在UI域中,我可以创建引用此属性的Property。但我不确定这是否可能。

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

另一种替代方法可能是使用JavaBeanProperty类,例如JavaBeanStringPropertyBuilder,JavaBeanIntegerPropertyBuilder。有可能吗?

我已经尝试了两种方式,但我很害怕我在JavaFX中没有经验,但尚未解决这个问题。 有人可以帮忙吗?

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

非常感谢。

1 个答案:

答案 0 :(得分:4)

除了在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字符串属性。您可以在属性更改侦听器中设置标签,而不是设置字符串属性,然后绑定到它。