【问题标题】:How to bind a JavaFX 8 object to a java variable?如何将 JavaFX 8 对象绑定到 java 变量?
【发布时间】:2016-02-25 17:19:43
【问题描述】:

我正在尝试在我的程序中将一个 TextField 绑定到一个字符串(属性“nombre”)。我已经看到您可以使用bind() 方法绑定两个JavaFX 对象,但是由于Java 变量没有属性,我无法使用它来将我的TextField 绑定到一个字符串。这是我试图实现这一目标的课程(没有 getter 和 setter):

public class NodoJugadores implements Serializable
{
private String nombre;
private int cedula;
private String sexo;
private int edad;
private String equipo;
private int categoria;
private int puntos;
private NodoJugadores proximo;
private NodoJugadores hijoIzquierdo;
private NodoJugadores hijoDerecho;

public NodoJugadores(String nombre, int cedula, String sexo, int edad, String equipo, int categoria, int puntos, NodoJugadores proximo)
{
    this.nombre = nombre;
    this.cedula = cedula;
    this.sexo = sexo;
    this.edad = edad;
    this.equipo = equipo;
    this.categoria = categoria;
    this.puntos = puntos;
    this.proximo = proximo;
}

public NodoJugadores(String nombre, int cedula, String sexo, int edad, String equipo, int categoria, int puntos, NodoJugadores hijoIzquierdo, NodoJugadores hijoDerecho) 
{
    this.nombre = nombre;
    this.cedula = cedula;
    this.sexo = sexo;
    this.edad = edad;
    this.equipo = equipo;
    this.categoria = categoria;
    this.puntos = puntos;
    this.hijoIzquierdo = hijoIzquierdo;
    this.hijoDerecho = hijoDerecho;
}

public void llenarGrid(GridPane grid)
{

    if(sexo.equalsIgnoreCase("m"))
    {
        for(int i = 0 ; i < 8 ; i++)
        {
            TextField text = new TextField(nombre);

            grid.add(text, i, 0);
        }
    }
}

static final long serialVersionUID = 8925409;
}

请尝试用一个实际的例子来解释它是如何工作的。我将不胜感激。此外,值得一提的是,我无法将我的 String 转换为 StringProperty,因为我正在对类进行序列化。

【问题讨论】:

  • 您可以使用StringProperty 并仍然创建课程Serializable。您只需要定义一个自定义的序列化表单。
  • @James_D 对不起,我不熟悉自定义序列化,我该怎么做?

标签: java variables javafx properties bind


【解决方案1】:

解决方案 1:使用StringProperty

使用StringProperty 和自定义序列化表单来创建Serializable 类:

public class NodoJugadores implements Serializable {

    private final transient StringProperty nombre = new SimpleStringProperty();

    public StringProperty nombreProperty() {
        return nombre ;
    }

    public final String getNombre() {
        return nombreProperty().get();
    }

    public final void setNombre(String nombre) {
        nombreProperty().set(nombre);
    }

    private void writeObject(ObjectOutputStream s) throws IOException {
        s.defaultWriteObject();
        s.writeObject(getNombre());
    }

    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
        s.defaultReadObject();
        this.nombre = new SimpleStringProperty((String) s.readObject());
    }
}

解决方案 2:使用 PropertyChangeListeners 和 JavaBeanPropertyAdapter

这在JavaBean wrapping with JavaFX Properties 中有介绍,但基本上你会这样做

public class NodoJugadores implements Serializable {

    private String nombre ;

    private final PropertyChangeSupport pcs ;

    public NodoJugadores() {
        this.pcs = new PropertyChangeSupport(this);
    }

    public String getNombre() {
        return nombre ;
    }

    public void setNombre(String nombre) {
        String oldNombre = this.nombre ;
        this.nombre = nombre ;
        pcs.firePropertyChange("nombre", oldNombre, this.nombre);
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        pcs.addPropertyChangeListener(listener);
    }

}

然后在你的 UI 代码中你可以做

Label nombreLabel = new Label();
NodoJugadores nj = new NodoJugadores();
nombreLabel.textProperty().bind(new JavaBeanStringPropertyBuilder()
    .bean(nj)
    .name("nombre")
    .build());

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2023-04-06
    • 2014-10-10
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多