2015-11-23 4 views
1

Я пытаюсь привязать TextField к String (атрибуту «nombre») в моей программе. Я видел, что вы можете связать два объекта JavaFX с помощью метода bind(), но поскольку переменные java не имеют свойств, я не могу использовать его для привязки своего TextField к String. Вот класс, где я пытаюсь добиться этого (без получения и установки):Как связать объект 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; 
} 

Пожалуйста, попытайтесь объяснить с реальным примером того, как это будет работать. Буду весьма признателен за это. Кроме того, стоит упомянуть, что я не могу преобразовать String в 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); 
    } 

} 

Затем в коде пользовательского интерфейса вы можете сделать

Label nombreLabel = new Label(); 
NodoJugadores nj = new NodoJugadores(); 
nombreLabel.textProperty().bind(new JavaBeanStringPropertyBuilder() 
    .bean(nj) 
    .name("nombre") 
    .build()); 
Смежные вопросы