Question

Je suis en train de créer une application factice qui maintient une liste de tâches.

Pour l'instant, tout ce que je suis en train de faire est d'ajouter à la liste. J'entre un nom de tâche dans une zone de texte, cliquez sur le bouton Ajouter une tâche, et attends la liste mise à jour avec le nouvel élément et l'entrée de nom de la tâche à effacer. Je veux seulement être en mesure d'ajouter des tâches si le nom de la tâche n'est pas vide. Le Code ci-dessous est ma mise en œuvre, mais j'ai une question concernant la liaison.

Je suis la variable de liaison du texte de la zone de texte à une chaîne dans mon modèle de vue, et variable à désactiver un booléen dans mon modèle de vue du bouton.

J'ai un déclencheur pour mettre à jour l'état désactivé lorsque le nom de la tâche change. Lorsque la liaison du nom de la tâche se produit le booléen est mis à jour en conséquence, mais le bouton apparaît toujours désactivé. Mais quand je souris sur le bouton, il est activé. Je crois que cela est dû à JavaFX 1.3 de liaison étant paresseux - ne met à jour la variable liée lorsqu'il est lu

.

En outre, quand j'ai ajouté la tâche, effacer le nom de la tâche dans le modèle, mais le texte de la zone de texte ne change pas -. Même si j'utilise bind with inverse

Y at-il un moyen de faire automatiquement via la liaison mise à jour de l'état désactivé du texte de la zone de texte et le bouton que je me attendais?

Merci,

James

AddTaskViewModel.fx:

package jamiebarrow;

import java.lang.System;

public class AddTaskViewModel {

function logChange(prop:String,oldValue,newValue):Void {
    println("{System.currentTimeMillis()} : {prop} [{oldValue}] to [{newValue}] ");
}


    public var newTaskName: String on replace old {
        logChange("newTaskName",old,newTaskName);
        isAddTaskDisabled = (newTaskName == null or newTaskName.trim().length() == 0);
    };
    public var isAddTaskDisabled: Boolean on replace old {
        logChange("isAddTaskDisabled",old,isAddTaskDisabled);
    };
    public var taskItems = [] on replace old {
        logChange("taskItems",old,taskItems);
    };

    public function addTask() {
        insert newTaskName into taskItems;
        newTaskName = "";
    }

}

Main.fx:

package jamiebarrow;

import javafx.scene.control.Button;
import javafx.scene.control.TextBox;
import javafx.scene.control.ListView;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.layout.HBox;

def viewModel = AddTaskViewModel{};

var txtName: TextBox = TextBox {
            text: bind viewModel.newTaskName with inverse
            onKeyTyped: onKeyTyped
        };

function onKeyTyped(event): Void {
    txtName.commit(); // ensures model is updated
    cmdAddTask.disable = viewModel.isAddTaskDisabled;// the binding only occurs lazily, so this is needed
}

var cmdAddTask = Button {
            text: "Add"
            disable: bind viewModel.isAddTaskDisabled with inverse
            action: onAddTask
        };

function onAddTask(): Void {
    viewModel.addTask();
}

var lstTasks = ListView {
            items: bind viewModel.taskItems with inverse
        };

Stage {
    scene: Scene {
        content: [
            VBox {
                content: [
                    HBox {
                        content: [
                            txtName,
                            cmdAddTask
                        ]
                    },
                    lstTasks
                ]
            }
        ]
    }
}
Était-ce utile?

La solution

Pour mémoire, cette question a reçu une réponse question concernant la liaison fil bouton état désactivé .

Résumé court: il y a un bogue dans JavaFX 1.3 pour bind with inverse aux champs dans des objets. Il existe une solution, mais il casse l'encapsulation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top