2015-11-23 26 views
1

我想在我的程序中將TextField綁定到String(屬性「nombre」)。我已經看到,您可以使用bind()方法綁定兩個JavaFX對象,但由於java變量沒有屬性,我無法使用它來將我的TextField綁定到String。這裏就是我想要做到這一點(沒有getter和setter)類:如何將JavaFX 8對象綁定到java變量?

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

請嘗試用如何做到這一點的工作一個實際的例子來解釋。我將不勝感激。另外,值得一提的是,我無法將我的字符串轉換爲StringProperty,因爲我正在對該類進行序列化。

+0

您可以使用'StringProperty',仍然使課堂'Serializable'。你只需要定義一個自定義的序列化表單。 –

+0

@James_D我很抱歉,但我不熟悉自定義序列化,我該怎麼做? – GFV450

回答

3

解決方法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:使用PropertyChangeListener S和JavaBeanPropertyAdapter

這涵蓋在JavaBean wrapping with JavaFX Properties,但基本LY,你會做

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()); 
相關問題