A classe Bindings contém mais de 200 fábricas de métodos que faz um novo bindings nos valores do observable e valores regulares. Os métodos são subscritos para as inúmeras combinações de tipos de parâmetros.
Os métodos add(), subtract(), multiply() e divide() faz o óbvio, cria um novo número com binding de dois outros valores, pelo menos um deles tem o valor observable.
No exemplo a seguir ilustra essa situação. Vamos calcular a área de um triângulo com os vértices (x1,y1), (x2,y2) e (x3,y3) utilizando a fórmula:
1 |
area = (x1*y2 + x2*y3 + x3*y1 – x1*y3 – x2*y1 – x3*y2)/2 |
TriangleAreaExample.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
package main.java.br.com.cursojavanow; import javafx.beans.binding.Bindings; import javafx.beans.binding.NumberBinding; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; public class TriangleAreaExample { public static void main(String[] args) { IntegerProperty x1 = new SimpleIntegerProperty(0); IntegerProperty y1 = new SimpleIntegerProperty(0); IntegerProperty x2 = new SimpleIntegerProperty(0); IntegerProperty y2 = new SimpleIntegerProperty(0); IntegerProperty x3 = new SimpleIntegerProperty(0); IntegerProperty y3 = new SimpleIntegerProperty(0); final NumberBinding x1y2 = Bindings.multiply(x1, y2); final NumberBinding x2y3 = Bindings.multiply(x2, y3); final NumberBinding x3y1 = Bindings.multiply(x3, y1); final NumberBinding x1y3 = Bindings.multiply(x1, y3); final NumberBinding x2y1 = Bindings.multiply(x2, y1); final NumberBinding x3y2 = Bindings.multiply(x3, y2); final NumberBinding sum1 = Bindings.add(x1y2, x2y3); final NumberBinding sum2 = Bindings.add(sum1, x3y1); final NumberBinding sum3 = Bindings.add(sum2, x3y1); final NumberBinding diff1 = Bindings.subtract(sum3, x1y3); final NumberBinding diff2 = Bindings.subtract(diff1, x2y1); final NumberBinding determinant = Bindings.subtract(diff2, x3y2); final NumberBinding area = Bindings.divide(determinant, 2.0D); x1.set(0); y1.set(0); x2.set(6); y2.set(0); x3.set(4); y3.set(3); printResult(x1, y1, x2, y2, x3, y3, area); x1.set(1); y1.set(0); x2.set(2); y2.set(2); x3.set(0); y3.set(1); printResult(x1, y1, x2, y2, x3, y3, area); } private static void printResult(IntegerProperty x1, IntegerProperty y1, IntegerProperty x2, IntegerProperty y2, IntegerProperty x3, IntegerProperty y3, NumberBinding area) { System.out.println("For A(" + x1.get() + "," + y1.get() + "), B(" + x2.get() + "," + y2.get() + "), C(" + x3.get() + "," + y3.get() + "), the area of triangle ABC is " + area.getValue()); } } |
A saída será a seguinte:
1 |
For A(0,0), B(6,0), C(4,3), the area of triangle ABC is 9.0 |
1 |
For A(1,0), B(2,2), C(0,1), the area of triangle ABC is 1.5 |
Outras fábricas de métodos com Bindings incluem os operadores lógicos and(), or() e not(); operadores numéricos min(), max() e negate(); operadores de teste null isNull() e isNotNull(); operadores string length(), isEmpty() e isNotEmpty() e operadores relacionais equal(), equalIgnoreCase(), greaterThan(), graterThanOrEqual(), lessThan(), lessThanOrEqual(), notEqual() e notEqualIgnoreCase().
O nome desses métodos são auto explicativos e todos eles fazem o que você acha que eles fazem. Por exemplo, para ter certeza de que o botão money está habilitado quando um recipiente é selecionado e a quantidade é maior que zero, podemos escrever assim:
1 2 3 |
sendBtn.disableProperty().bind(Bindings.not( Bindings.and(recipientSelected, Bindings.greaterThan(amount, 0.0)))); |
Há um grupo de fábrica de métodos chamado createDoubleBindig() que também permite você criar um binding a partir de um Callable e grupo de dependências. O DoubleBinding que criamos nesse código:
DirectExtensionExample.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package main.java.br.com.cursojavanow; import javafx.beans.binding.DoubleBinding; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; public class DirectExtensionExample { public static void main(String[] args) { System.out.println("Constructing x with value 2.0."); final DoubleProperty x = new SimpleDoubleProperty(null, "x", 2.0); System.out.println("Constructing y with value 3.0."); final DoubleProperty y = new SimpleDoubleProperty(null, "y", 3.0); System.out.println("Creating binding area" + " with dependencies x and y."); DoubleBinding area = new DoubleBinding() { { super.bind(x, y); } @Override protected double computeValue() { System.out.println("computeValue()" + " is called."); return x.get() * y.get(); } }; System.out.println("area.get() = " + area.get()); System.out.println("area.get() = " + area.get()); System.out.println("Setting x to 5"); x.set(5); System.out.println("Setting y to 7"); y.set(7); System.out.println("area.get() = " + area.get()); } } |
Pode ser simplificado assim:
1 2 3 |
DoubleBinding area = Bindings.createDoubleBinding(() -> { return x.get() * y.get(); }, x, y); |
Os métodos convert(), concat() e outros sobrescritos format() podem ser utilizados para converter o valor non-string observable para uma observable string, concatenar vários valores do observable string, e formatar um valor de observable numérico para um valor de observable string.
Par mostrar o valor de temperatura em uma Label, podemos fazer assim:
1 |
tempLbl.textProperty().bind(Bindings.format(“%2.1f \u00b0C”, temperature)); |
Quando o valor da property da temperatura muda, o formato da representação da string da temperatura muda com ela. Por exemplo, quando a temperatura é 37.5, o label irá mostrar 37.5 ºC.
Há um grupo de fábrica de métodos chamado select() e selectInteger() e é assim que funciona o JavaFX Beans, classes do Java que estão conforme a convenção do JavaFX Bean.
Há também métodos que funcionam na observable collections, observables que não contém um simples valor, mas um List, um Map, um Set ou um array de elementos.
Fonte: The Definitive Guide to Modern Java Clients with JavaFX
Deixe um comentário