JavaFX - question concernant l'état désactivé bouton de liaison de
-
05-10-2019 - |
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
]
}
]
}
}
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.