2017-10-19 28 views
0

situation suivante:Intercept Binding Propriété

DoubleProperty p1 = new SimpleDoubleProperty(1.0); 
DoubleProperty p2 = new SimpleDoubleProperty(5.5); 

p1.bind(p2); 

Est-il en quelque sorte possible de modifier cette façon d'intercepter tout droit vers l'avant le processus de réglage de la valeur afin de modifier la valeur de consigne?

+0

Modifier comment? Il existe différentes façons de créer des liaisons personnalisées, si vous en avez besoin, mais je ne suis pas sûr que ce soit ce que vous recherchez. –

Répondre

0

Si SimpleDoubleProperty n'est pas définitif, vous pouvez remplacer la fonction bind() comme suit et créer une sous-classe anonyme:

DoubleProperty p1 = new SimpleDoubleProperty(1.0){ 
    @Override 
    public void bind(DoubleProperty property){ 
     // do your interception-magic here 
    } 
}; 
0

Si vous voulez juste effectuer des opérations arithmétiques simples sur la valeur, vous pouvez utiliser l'API de liaison, qui prend en charge un ensemble assez riche de fonctions arithmétiques:

p1.bind(p2.multiply(p2).add(1)); 

fera en sorte que p1 est toujours égale à p2*p2+1 (comme un exemple arbitraire), et

p1.bind(Bindings 
    .when(p2.lessThan(0)) 
    .then(0) 
    .otherwise(p2)); 

veillera à ce que p1 est toujours égale à p2 quand p2 est non-négatif et p1 est nul autrement.

Si cela ne suffit pas à vos besoins, vous pouvez utiliser un exemple de liaison personnalisé:

p1.bind(Bindings.createDoubleBinding(() -> { 
    double p2Value = p2.getValue(); 
    double interceptedValue = ... ; 
    return interceptedValue ; 
}, p2); 

Le dernier argument est un varargs de Observable, de sorte que vous pouvez lister toutes les propriétés (ou d'autres observables) là que vous voulez déclencher une invalidation de la liaison.

Une façon équivalente est de sous-classe DoubleBinding:

p1.bind(new DoubleBinding() { 
    { 
     bind(p2); // and to other properties if needed... 
    } 

    @Override 
    protected double computeValue() { 
     double p2Value = p2.getValue(); 
     double interceptedValue = ... ; 
     return interceptedValue ; 
    } 
}); 
+0

Merci pour votre réponse, je suppose que cela ferait ce dont j'ai besoin. Mais: J'ai essayé de le faire dans la méthode @FXML public void initialize() {..} 'du contrôleur et j'obtiens une exception" Les valeurs liées ne peuvent pas être définies "- probablement par le moteur de mise en page lui-même. – Hannes

+0

@Hannes Cela semble indépendant de cela. Vous ne pouvez pas définir de valeurs liées, que vous les liez directement à une autre propriété ou à une liaison plus complexe. Qu'essayez-vous de lier? –

+0

La propriété layoutXProperty d'un TextField à la propriété respective d'une ComboBox – Hannes