2010-05-27 10 views
0

J'essaie de créer une application fictive qui maintient une liste de tâches.JavaFX - question concernant l'état désactivé du bouton de liaison

Pour l'instant, tout ce que j'essaie de faire est d'ajouter à la liste. Je saisis un nom de tâche dans une zone de texte, cliquez sur le bouton Ajouter une tâche et j'attends que la liste soit mise à jour avec le nouvel élément et l'entrée du nom de la tâche à effacer. Je veux seulement pouvoir 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 lie la variable de texte de la zone de texte à une chaîne dans mon modèle de vue, et la variable de désactivation du bouton à un booléen dans mon modèle de vue.

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 devient activé. Je crois que cela est dû au fait que la liaison de JavaFX 1.3 est paresseuse - ne met à jour la variable liée que lorsqu'elle est lue.

De même, lorsque j'ai ajouté la tâche, j'efface 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 a-t-il un moyen de mettre automatiquement à jour le texte de la zone de texte et l'état désactivé du bouton via la liaison comme je m'y 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 
       ] 
      } 
     ] 
    } 
} 
+0

Remarque: la méthode onKeyTyped permet de s'assurer que la zone de texte met à jour le modèle lorsque l'utilisateur tape et non lorsqu'il perd le focus et que l'état cmdAddButton est mis à jour. – jamiebarrow

Répondre

1

Pour mémoire, cette question ont reçu une réponse question regarding binding button’s disabled state fil.

Résumé: il existe un bogue dans JavaFX 1.3 pour bind with inverse aux champs dans les objets. Il existe une solution de contournement, mais elle casse l'encapsulation.

+0

Merci encore PhiLho. Je n'ai pas vraiment mis en place le changement mais ça a l'air bien, alors faites confiance que ça marche pour l'instant :) Je revérifierai quand j'aurai une chance. – jamiebarrow