JavaFX bidireccional de enlace no funciona con el control de convertirse en no editable

Dar una clase de primaria (importaciones resuelto en javafx paquetes):

public class T07 extends Application implements Initializable{

con algunos campos en representación de los controles definidos en una .fxml de archivo:

@FXML TextField text01;

y un modelo de datos que utiliza la Propiedad de los encapsuladores en la forma más básica:

public static class DataModel {

    StringProperty first = new SimpleStringProperty();
    //getter
    public String getFirst() {return first.get();}
    //setter
    public void setFirst(String first) {this.first.set(first);}
    //new "property" accessor
    public StringProperty firstProperty() {return first;}

}

Intento de obligar el control de interfaz de usuario con el modelo de datos dentro de la inicializar:

@Override
public void initialize(URL arg0, ResourceBundle arg1) {

   Bindings.bindBidirectional(text01.textProperty(), dm.firstProperty());

}

pero al hacerlo, tengo un no-editable control. comentando los Enlaces.bindBidirectional línea, el control se convierte normalmente editable y su valor accesible a través de text01 campo.

¿Cuál es el ingrediente que falta en este enlace receipe?

InformationsquelleAutor AgostinoX | 2012-07-03

1 Kommentar

  1. 8

    Bidireccional ejemplo de enlace:

    import javafx.application.Application;
    import javafx.beans.binding.Bindings;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Stage;
    
    public class JavaFXApplication10 extends Application {
    
        private Model model = new Model();
    
        @Override
        public void start(Stage primaryStage) {
    
            final TextField textField = new TextField();
    
            Bindings.bindBidirectional(textField.textProperty(), model.firstProperty());
    
            //Track the changes
            model.firstProperty().addListener(new ChangeListener<String>() {
                @Override
                public void changed(ObservableValue<? extends String> arg0, String arg1, String arg2) {
                    System.out.println("model old val: " + arg1);
                    System.out.println("model new val: " + arg2);
                    System.out.println();
                }
            });
    
            textField.textProperty().addListener(new ChangeListener<String>() {
                @Override
                public void changed(ObservableValue<? extends String> arg0, String arg1, String arg2) {
                    System.out.println("textField old val: " + arg1);
                    System.out.println("textField new val: " + arg2);
                    System.out.println();
                }
            });
    
            Button btn = new Button();
            btn.setText("Change the model's text");
            btn.setOnAction(new EventHandler<ActionEvent>() {
    
                @Override
                public void handle(ActionEvent event) {
                    model.setFirst("changed from button action");
                    System.out.println("Done.");
                }
            });
    
            BorderPane root = new BorderPane();
            root.setTop(textField);
            root.setBottom(btn);
            primaryStage.setScene(new Scene(root, 300, 250));
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
        //Data Model
        public static class Model {
    
            StringProperty first = new SimpleStringProperty();
            //getter
    
            public String getFirst() {
                return first.get();
            }
            //setter
    
            public void setFirst(String first) {
                this.first.set(first);
            }
            //new "property" accessor
    
            public StringProperty firstProperty() {
                return first;
            }
        }
    }

    Bidireccional encuadernación:

    1 forma de Texto introducido en el campo de texto se verá reflejado en el modelo de la primera stringProperty.

    2º manera contraria – Haciendo clic en el botón, usted se dará cuenta que al modelo de la primera stringProperty se establece, el campo de texto del valor de texto también será cambiado.

    • Mirando el código de la pregunta, no veo lo que este código está haciendo que es funcionalmente diferente. Acabo de ver el código que controla lo que está pasando. Lo arregla?
    • Significa «aquí es un ejemplo de trabajo con no ‘no editable control de su comportamiento, por lo que debe buscar su código de nuevo».

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea