java.net member

Rechercher dans ce site

Showing posts with label JavaFX - Langage. Show all posts
Showing posts with label JavaFX - Langage. Show all posts

JSF Validation - Part 3

>> 19 May 2010

 In this part we will see how to customize validation for your need.

If validation is not supported by the standard validators

In this case you can :

  • Write a method in your bean (JSF mainly works with beans to get and set Data)
  • Write a custom validator
  • Create your own library and tags

Write a custom method

You can provide a method in your business bean. The validator attribute will use this method to validate the input. If the converted value is considered invalid, it should throw a ValidatorException and provide a FacesMessage.


The Expression Language is used here to point to a method on an arbitrary JavaBean that adheres to the contract and signature of Validator.validate( ). This can greatly simplify application design by allowing you to put the
business logic, and the method to validate it, in the same class.

Note:
Detailed message is used with <h:message />.By default, the UI Messages will
display the summary messages.(<h:messages /> with "s")

Note:
validate must be defined like this :

public void validate(FacesContext context,
UIComponent component,
Object enterdValue)
throws ValidatorException


 In a bean add a method (here ValidateMail)
//==================================================
    //validateMail
    //==================================================
    public void validateMail(FacesContext context,//jsf engine) 
                             UIComponent component, //the component
                             Object enteredValue//must not be empty
                             )throws ValidatorException
      {
        String email=(String)enteredValue;
        if(email.trim().equals("") || !email.matches("^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\\-+)|([A-Za-z0-9]+\\.+)|([A-Za-z0-9]+\\++))*[A-Za-z0-9]+@((\\w+\\-+)|(\\w+\\.))*\\w{1,63}\\.[a-zA-Z]{2,6}$") )
      
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                     "Error Entered e-mail",//summary msg
                     "Entered e-mail: \""+email+"\" is invalid"//detailed msg
                                     ));
    }

In testValidation.xhtml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"

      xmlns:f="http://java.sun.com/jsf/core"

      xmlns:h="http://java.sun.com/jsf/html"
    
      >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test Validation</title>
</head>
<body>
<h:messages/>
<f:view>

<h:form id="form">
<h:outputLabel for="name" value="Enter Name"/>
<h:inputText required="true" label="name" id="sname">
<f:validateLength minimum="3" maximum="20"/>
</h:inputText>
<h:outputLabel for="double" value="Enter Double Value"/>
<h:inputText required="true" label="double">
<f:validateDoubleRange minimum="2.0" maximum="20.1" />
</h:inputText>

<h:outputLabel for="long" value="Enter Long Value"/>
<h:inputText required="true" label="long">
<f:validateLongRange minimum="0" maximum="10" />
</h:inputText>

<h:outputLabel for="email" value="Enter Your email"/>
<h:inputText required="true" label="email" validator="#{person.validateMail}"/>

<h:commandButton action="ok" value="Validate" />
</h:form>
</f:view>
</body>
</html>

Display

If one of the conditions is missed, an error message is displayed


When email is valid no more error message







Create a Validator

1.Create a class that implements the javax.faces.validator.Validator interface
2.Implement the validate() method
3.Register this validator in the configuration file "faces-confix.xml"
4.Put <f:validator validatorId="xxx" to use it.

Note:
Using a custom validator offers the possibility of re-using this component.
Create a class that implements the javax.faces.validator.Validator interface


EMailValidator.java

package fr.iipt.ka.faces;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class EMailValidator implements Validator{
  
    //==================================================
    //validateMail
    //==================================================
    public void validate(FacesContext context,//jsf engine) 
                             UIComponent component, //the component
                             Object enteredValue//must not be empty
                             )throws ValidatorException
      {
        String email=(String)enteredValue;
        if(email.trim().equals("") || !email.matches("^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\\-+)|([A-Za-z0-9]+\\.+)|([A-Za-z0-9]+\\++))*[A-Za-z0-9]+@((\\w+\\-+)|(\\w+\\.))*\\w{1,63}\\.[a-zA-Z]{2,6}$") )
      
        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                     "Error Entered e-mail - custom class",//summary msg
                                     "Entered e-mail: \""+email+"\" is invalid"//detailed msg
                                     ));
    }

}

Edit faces-config.xml

<faces-config>
...
<validator>
 <validator-id>checkMail</validator-id>
 <validator-class>fr.iipt.ka.faces.EMailValidator</validator-class>
 </validator>
 </faces-config>


In testValidation.xhtml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"

      xmlns:f="http://java.sun.com/jsf/core"

      xmlns:h="http://java.sun.com/jsf/html"
    
      >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test Validation</title>
</head>
<body>
<h:messages/>
<f:view>

<h:form id="form">


<b>Validate email using custom method in JavaBean</b><br/>
<h:outputLabel for="email" value="Enter Your email"/><br/>
<h:inputText required="true" label="email" validator="#{person.validateMail}"/><br/>

<b>Validate email using custom custom class</b><br/>
<h:outputLabel for="email" value="Enter Your email"/><br/>
<h:inputText required="true" label="email2">
<f:validator validatorId="checkMail"/>
</h:inputText>


<h:commandButton action="ok" value="Validate" />
</h:form>
</f:view>
</body>
</html>

Display

Create your own tags

It's possible to create custom validation classes and put them in a facelet tag lib, use them the same way as the core tag lib or html tag lib. Steps to do this are the same as creating a custom validation class with one exception, you must create a taglib descriptor.

First step :

Create a custom validation class this class must implement Validator and provide validate method (the same as the previous custom validation class). Let it have a modified error message (just to see the result)

EMailValidator2.java

package fr.iipt.ka.faces;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class EMailValidator2 implements Validator{
  
    //==================================================
    //validateMail
    //==================================================
    public void validate(FacesContext context,//jsf engine) 
                             UIComponent component, //the component
                             Object enteredValue//must not be empty
                             )throws ValidatorException
      {
        String email=(String)enteredValue;
        if(email.trim().equals("") || !email.matches("^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\\-+)|([A-Za-z0-9]+\\.+)|([A-Za-z0-9]+\\++))*[A-Za-z0-9]+@((\\w+\\-+)|(\\w+\\.))*\\w{1,63}\\.[a-zA-Z]{2,6}$") )
      
        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                     "Error Entered e-mail - facelet tag lib",//summary msg
                                     "Entered e-mail: \""+email+"\" is invalid"//detailed msg
                                     ));
    }

}

Second Step

Register this class as validator in the configuration file "faces-confix.xml", give your validator any ID and specify it's class.


<faces-config>
...
...
<validator>
 <validator-id>ka.faceletTag.1</validator-id>
 <validator-class>fr.iipt.ka.faces.EMailValidator2</validator-class>
 </validator>
 </faces-config>

Third Step

Create a facelet tag lib descriptor (in src/META-INF folder), give it a name with .taglib.xml extension. Define your tag(s), (every tag will be called in facelet .xhtml file with it's name). Associate the tag name with it's validator.

ka.taglib.xml

<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet" >

<namespace>http://iipt.fr</namespace>

<tag>
<tag-name>validateMail</tag-name>

<validator>
<validator-id>ka.faceletTag.1</validator-id>
</validator>
</tag>
</facelet-taglib>

Now you can use your tag(s)

testValidation.xhtml

Declare a name space with a prefix, in the body of <h:inputText use the same prefix with your custom tag name

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"

      xmlns:f="http://java.sun.com/jsf/core"

      xmlns:h="http://java.sun.com/jsf/html"
    
      xmlns:ka="http://iipt.fr"
      >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test Validation</title>
</head>
<body>
<h:messages/>
<f:view>

<h:form id="form">


<b>Validate email using custom method in JavaBean</b><br/>
<h:outputLabel for="email" value="Enter Your email"/><br/>
<h:inputText required="true" label="email" validator="#{person.validateMail}"/><br/>

<b>Validate email using custom class</b><br/>
<h:outputLabel for="email" value="Enter Your email"/><br/>
<h:inputText required="true" label="email2">
<f:validator validatorId="checkMail"/>
</h:inputText>
<br/>
<b>Validate email using facelet tag lib</b><br/>
<h:outputLabel for="email" value="Enter Your email"/><br/>
<h:inputText required="true" label="email3">
<ka:validateMail />
</h:inputText>
<br/>

<h:commandButton action="ok" value="Validate" />
</h:form>
</f:view>
</body>
</html>

Display

Read more...

Data Binding de JavaFX, Des liens directs et instantanés entre variables

>> 11 March 2009

Un mécanisme permettant de lier une variable à une autre (ou plusieurs variables), ou une expression, le changement de la variable liée (avec bind), entraine le changement automatique de la variable cible. Très utile pour synchroniser des composants graphiques avec des données.

def x= bind y;
//la variable cible "x", change automatiquement avec les changements de "y"

Le mot clé "bind" associe une variable cible avec une expression et permet de lier :

  • Une simple variable à une autre variable de types de base
  • Une variable à un objet
  • Une variable au résultat d'une expression
  • Une variable à la valeur de retour d'une fonction
  • Une variable à un bloc d'expressions.

Il y a deux types de liens (bind)
  • unidirectionnel avec le mot bind
  • bidirectionnel (bind ... with inverse).

Le lien unidirectionnel fonctionne dans un seul sens, modifiant la variable cible.

def x= bind y;//la variable cible est "x"

Le lien bidirectionnel effectue des changements dans les deux sens.

var y=10;
def x bind with inverse y; //"x" change avec des changements de "y" et inversement

Note :
Au moment d'un changement effectué par un lien (bind) un minimum de recalculation est fait

Exemple :
Lier la variable "x" à la variable "y". Remarquez que nous avons utilisé "var x" dans cet exemple pour le comparer avec l'exemple suivant, normalement les variables liées sont déclarées avec "def", pour éviter le changement direct.

var y = 10;
var x = bind y;


println("y = {y} : x = {x}");

y=5;

println("y = {y} : x = {x}");



Exemple :
Le même que le précédent. Quand on essaye de modifier une variable liée, le compilateur affiche des erreurs, même étant déclarée avec "var"


var y = 10;
var x = bind y;


println("y = {y} : x = {x}");

y=5;

println("y = {y} : x = {x}");


x=20;

println("y = {y} : x = {x}");



Exemple :
Deux variable sont liées avec "bind with inverse". Le changement de "y" change la valeur de "x" et inversement.


var y = 10;
var x = bind y with inverse;


println("y = {y} : x = {x}");

y=5;

println("y = {y} : x = {x}");


x=20;

println("y = {y} : x = {x}");



Exemple :
"def" à la place de "var"

/**
* @author Kaesar ALNIJRES
*/
var x = 5;
def y = bind x;
for(i in [0..5])
{
x+=i;
println("x est maintenant ={x} et y = {y}");
}



Lier des variables d'instance à des variables externes

Note :
Quand on utilise bind avec un objet littéral d'une classe on provoque une création d'objet avec chaque changement des variables externes.

La variable d'instance "x" est liée à la variable "i"
La variable d'instance "y" est liée à la variable "i2"

Exemple :

/**
* @author Kaesar ALNIJRES
*/
var i = 5;
var i2 = 4;

class Point
{
var x: Integer;
var y: Integer;
}

def p = bind Point
{
x:i;
y:i2;
}

println("p.x = {p.x} et p.y = {p.y}");



Lier des variables d'instance suite :
Il est aussi possibles de lier des variables d'instance à des variables externes, simplement , en liant chaque variable d'instance à une variable externe (comme pour les variables simples)

Note :
Dans ce cas pas de création de nouveau objet à chaque changement de variables externes

Exemple :

/**
* @author Kaesar ALNIJRES
*/
var i = 5;
var i2 = 4;
class Point
{
var x: Integer;
var y: Integer;
}
def p = Point
{
x: bind i;
y: bind i2;
}
for(n in [0..5])
{
i+=n;
i2+=n;
println("p.x = {p.x} et p.y = {p.y}");
}



Utiliser bind avec des fonctions
Pour une fonction préfixée par "bind" chaque changement de ses paramètres, re-invoque cette fonction avec les nouveaux paramètres.

Exemple :

/**
* @author Kaesar ALNIJRES
*/
function ajouterChiffres(n1:Integer,n2:Integer):Integer {
n1 + n2;
}


var num1 = 5;
var num2 = 4;

def result = bind ajouterChiffres(num1,num2);
println(result);

num1=1;//changement d'un paramètre
println(result);



Exemple :
Le même que le précédent

/**
* @author Kaesar ALNIJRES
*/
function ajouterChiffres(n1:Integer,n2:Integer): Integer{
var r=n1+n2;
println(r);
r;
}


var num1 = 5;
var num2 = 4;

def result = bind ajouterChiffres(num1,num2);


num1=1;//changement d'un paramètre



Utiliser une variable globale dans une fonction avec bind
Le changement d'une variable globale, qui n'est pas passée en paramètre de la fonction n'entraine pas le re-invoquation de la fonction.


Exemple :

/**
* @author Kaesar ALNIJRES
*/
function ajouterChiffres(n1:Integer,n2:Integer): Integer{
var r = (n1 + n2) * facteur;


}
var num1 = 5;
var num2 = 4;
var facteur = 10;

def result = bind ajouterChiffres(num1,num2);
println(result);

num1=1;//changement d'un paramètre
println(result);

facteur=100;
println(result);




Utiliser une fonction avec le mot clé "bound"
Une fonction qui a l'attribut "bound" dans sa déclaration et en combinaison avec "bind" est re-invoquer à chaque changement des ses paramètres ou des variables globales utilisées dans cette fonction. Une fonction "bound" doit obligatoirement retourner une valeur (Void n'est pas autorisée)

Note :
Le corps d'une fonction est un bloc d'expression. Pour une fonction avec "bound" des restrictions existent comme dans un bloc d'expression "bind".

  • Dans les expressions avant l'expression finale. Les seuls opérations permises sont des définitions de variables.
  • On ne peut pas utiliser l'incrémentation et décrémentation.
  • while, insert, delete sont interdits (ces instructions retourne Void et ne sont pas des déclarations)

Exemple :

/**
* @author Kaesar ALNIJRES
*/
bound function ajouterChiffres(n1:Integer,n2:Integer): Integer{
var r = (n1 + n2) * facteur;


}
var num1 = 5;
var num2 = 4;
var facteur = 10;

def result = bind ajouterChiffres(num1,num2);
println(result);

num1=1;//changement d'un paramètre
println(result);

facteur=100;
println(result);



Bind des séquences
A l'instar des variables simples, il est possible de lier des séquences avec le mot clé "bind"

Exemple :

/**
* @author Kaesar ALNIJRES
*/
var seq1 = [1..10];
def seq2 = bind seq1;
println("{for(i in seq1) i}");
println("{for(i in seq2) i}");

insert 20 into seq1;
println("=====================================");
println("{for(i in seq1) i}");
println("{for(i in seq2) i}");



Bind avec for
Il est possible d'utiliser "bind" avec "for" pour combiner deux séquences

Exemple :

/**
* @author Kaesar ALNIJRES
*/
var seq1 = [1..5];
def seq2 = bind for (item in seq1) item*2;


println("{for(i in seq1) "\n{i}"}");
println("{for(i in seq2) "\n{i}"}");

insert 20 into seq1;
println("=====================================");

println("{for(i in seq1) "\n{i}"}");
println("{for(i in seq2) "\n{i}"}");




Lier une variable à une expression

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.ext.swing.SwingLabel;

/**
* @author kas
*/

class Counter {
var value: Integer;
}

def count=Counter
{
value:0;
}


Stage {
title: "Application title"
width: 250
height: 80
scene: Scene {
content: [
Text {
font: Font {
size: 16
}
x: 10,
y: 30
content: "Application content"
},
SwingLabel {
text: bind count.value.toString();
}
]
}
}

Expression conditionnelles avec bind
Il est possible d'utiliser une clause conditionnelle pour lier une variable à une ou l'autre expression selon le résultat de la condition.

Exemple :

La variable "z" prend la valeur de "x" ou "y" selon la valeur de "x"

var y = 10;
var x = 10;

def z = bind if (x<=0) y else x;


println("y = {y} : x = {x} et z = {z}");

y=5;

println("y = {y} : x = {x} et z = {z}");

x=0;

println("y = {y} : x = {x} et z = {z}");



Utiliser un bloc d'expression bind
Il est possible d'assigner une bloc d'expression avec bind à une variable. La valeur de cette expression est l'expression finale.

Exemple :

/**
*@author : Kaesar ALNIJRES
*/
var y = 10;
var x = 10;
def z = bind {
def a = x;
def b = y;
a+b;
}

println("y = {y} : x = {x} et z = {z}");

y=5;

println("y = {y} : x = {x} et z = {z}");

x=0;

println("y = {y} : x = {x} et z = {z}");



Limitation :
Dans un bloc d'expression avec bind. Il est interdit d'utiliser

  • Dans les expressions avant l'expression finale. Les seuls opérations permises sont des définitions de variables.

def a = x;

  • Dans un bloc d'expression bind on ne peut pas utiliser l'incrémentation et décrémentation.

var y = 10;
var x = 10;
def z = bind {
def a = x;
def b = y;
a++;//ERREUR

}

  • while, insert, delete sont interdits dans le bloc bind (ces instructions retourne Void et ne sont pas des déclarations)
var y = 10;
var x = 10;
def z = bind {
def a = x;
def b = y;
while(a) b;//Erreur

}



Bind et les composants graphiques :
La possibilité de lier des variables avec bind est très intéressant, spécialement dans les développement de composants graphiques, permettant de modifier des composants avec le changement de leurs modèles (ou données). En Swing il faut utiliser des Listeners, nettement plus complexe à utiliser.

Exemple :
Deux zones de texte permettant de modifier les coordonnées x et y du center du cercle avec deux instructions "bind". Le source est commenté.

/*
* Hello.fx
*
* Created on Mar 1, 2009, 9:20:25 PM
*/

import javafx.ext.swing.SwingButton;
import javafx.ext.swing.SwingLabel;
import javafx.ext.swing.SwingTextField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.Scene;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

/**
* @author Kaesar ALNIJRES
*/
var w = 500;//largeur Stage
var h = 500; //hauteur Stage

var x = 100; //center X
var y= 100; //center y

var stfx = SwingTextField {
columns: 10
text: "100"
editable: true
}

var stfy = SwingTextField {
columns: 10
text: "100"
editable: true
}

Stage {
title: "Exemple de bind"
width: w;
height: h;
scene: Scene {
content: VBox{
content: [
SwingLabel {
//uniquement pour afficher x et y
text: bind "Center X, : {x},{y}";
},
stfx,//SwingTextField définie la-haut
stfy,
SwingButton {
text: "Bouger"
action: function() {
//Obtient le text dans SwingTextFiled, après conversion le metter dans x
x=java.lang.Integer.parseInt(stfx.getJTextField().getText());

//même chose pour y
y=java.lang.Integer.parseInt(stfy.getJTextField().getText());

}
},
Circle {
centerX: bind x;
centerY: bind y;
radius: 40
fill: Color.BLACK
}

]
}

}

}



Exemple graphique
Comment lier des composants graphiques avec des variables.



import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.ext.swing.SwingTextField;

/**
* @author Kaesar ALNIJRES
*/
var chaine="Hello World";

var tf=SwingTextField {
columns: 10
text: bind chaine with inverse;
editable: true
}


Stage {
title: bind chaine;
width: 250
height: 80
scene: Scene {
content:tf
}
}



Exemple :
Lier des variables d'instance ensemble.

/*
* Hello.fx
*
* Created on Mar 1, 2009, 9:20:25 PM
*/

import javafx.ext.swing.SwingButton;
import javafx.ext.swing.SwingLabel;
import javafx.ext.swing.SwingTextField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.Scene;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

/**
* @author Kaesar ALNIJRES
*/
var w = 500;//largeur Stage
var h = 500; //hauteur Stage

var x = 100; //center X
var y= 100; //center y

var stage;

var stfx = SwingTextField {
columns: 10
text: "100"
editable: true
}

var stfy = SwingTextField {
columns: 10
text: "100"
editable: true
}

var c0 = Circle {
centerX: bind x;
centerY: bind y;
radius: 40
fill: Color.BLACK
}

var c1 = Circle {
centerX: bind c0.centerX+100;
centerY: bind c0.centerY-100;
radius: 40
fill: Color.RED
}

Stage {
title: "Exemple de bind"
width: w;
height: h;
scene: Scene {
content: VBox{
content: [
SwingLabel {
text: bind "Center X, : {x},{y}";
},
stfx,//SwingTextField définie la-haut
stfy,//idem
SwingButton {
text: "Bouger"
action: function() {
//Obtient le text dans SwingTextFiled, après conversion le metter dans x
x=java.lang.Integer.parseInt(stfx.getJTextField().getText());

//même chose pour y
y=java.lang.Integer.parseInt(stfy.getJTextField().getText());

}
},c0,c1,


]
}

}

}

Read more...

Les expressions de JavaFX - Partie 2

>> 08 March 2009

while expressions

  • L'expression while retourne Void (vide)
  • while boucle tant que une condition est true (vrai)
  • A instar de Java, le test dans la clause while doit être une valeur boolean

Exemple :

/**@author Kaesar ALNIJRES */

//Attention boucle infinie
//Vous pouvez simplement utiliser while(true)

while(1 < 2)

println("Boucle infinie");



Exemple :

/** * @author Kaesar ALNIJRES */

var x = 10;

var y=0;
while (y < x) //Le code est exécute tant que "y < x"

{ y++;
println(y);
}



break et continue expressions
  • break permet de quitter une boucle en-cours
  • continue permet de reboucler en sautant les instructions après continue
  • Les deux expressions "break" et continue" retournent Void

Exemple :

/** * @author Kaesar ALNIJRES */


//affiche tous les chiffres de 0 à 5 à l'exception de 3


for (i in [0..10])
{
if (i > 5)
{

break;//quitter la boucle
}
if (i == 3)
{

continue; //saute la/les instruction et reboucle
}
println(i);
}




Expression try, catch, finally
Comme en Java l'interruption anormale d'exécution au sein d'un script se traduit par le lancement d'une exception.

Pour éviter l'arrêt anormal d'un script suite à une exception, nous interceptons l'exception pour solutionner le problème, si possible et continuer normalement. Nous pouvons intercepter une grande partie d'exceptions.

Une clause "try" avec ses accolades permet d'entourer des expressions susceptibles de lancer une exception. La clause "catch" suivant "try" permet en cas de problème d'exécuter des expressions prévues par le développeur pour résoudre le problème.

La clause "finally" comme en Java, complète "try" et "catch" et est appelée après la clause try dans tous les cas, si une exception est lancée ou non

Le format dans JavaFX est

try { foo(); }

catch (e: Exception)
{
println("{e.getMessage()}"); }

finally {
}

Exemple :

/** * @author Kaesar ALNIJRES */

import java.io.BufferedReader;
import java.io.FileReader;
import java.lang.Exception;
import java.lang.String;


var buffer;


try
{

//ouvre le fichier test.txt
buffer = new BufferedReader(new FileReader("/home/kas/NetBeansProjects/JavaFXApplication2/src/test.txt"));

var s: String;


while ( (s = buffer.readLine()) != null)
{

println(s);
}
} catch (e:Exception)
{

e.printStackTrace();
}
finally
{

try { if(buffer != null)
buffer.close();
} catch (e1:Exception) { e1.printStackTrace(); }
}




Exemple suite :
Si le fichier spécifié n'est pas trouvé, le script lance une exception. Ici la clause catch imprime uniquement l'origine du problème. Dans la pratique et selon la nature de l'erreur, on essaye de trouver une solution pour que le programme continue.



Range expression
Voir Sequences

For expression
Voir for

Read more...

Les Expressions de JavaFX - Partie 1

>> 07 March 2009

Les expressions sont des morceaux de code exécutables, leur évaluation retourne une valeur, ou elles sont de type Void (vide). Tout est expression en JavaFX, y compris var et def.


Block Expression (bloc d'expressions)
Un ensemble d'instructions, séparées par point virgule à l'intérieur de deux accolades { et }
La valeur de cette expression est la dernière instruction dans le bloc. S'il n'y a pas d'instructions dans le bloc, ce bloc retourne Void.

Exemple :


/**
* @author Kaesar ALNIJRES
*/

var seq =[1..3];
var total={
var t=0;
for(i in seq)
t+=i;
t;

}

println(total);



If expression
l'instruction if permet d'exécuter un bloc de code, si la condition if est évaluée à true (vrai)

La plupart des exemples utilisent un format court de if et else

if(condition) valeur else valeur

Exemple :

If permet de retourner avec else un sous type de la variable à gauche.
Ici "n" et "s" sont des objets

/**
* @author Kaesar ALNIJRES
*/


var n = 3;
var n2 = if(n instanceof java.lang.Integer) 5 else "5";
println(n2.getClass());

var s = "3";
var s2 = if(s instanceof java.lang.String) "5" else 5;
println(s2.getClass());



Exemple :
If expression retournant une chaîne de caractères (String)

/**
* @author Kaesar ALNIJRES
*/

var nombre = 3;
var s = if(nombre >= 2) "s" else "";
println("J'ai {nombre} pomme{s}");



Exemple :
Formater l'affichage des chiffres dans une chaîne. Met un 0 si le chiffre est moins de 10

/**
* @author Kaesar ALNIJRES
*/
var num = [1..10];
var n;
for(i in num)
{
if(i < 10) {
n="0{i}";
}

else {
n="{i}";
}

println(n);
}



Et si on omet des accolades { et } pour une instruction unique dans la clause if ?
Sans problème, bien qu'il est conseillé comme en Java d'utiliser des accolades. Cependant il faut faire attention car des détails très subtils existent

Exemple :
/**
* @author Kaesar ALNIJRES
*/
var n = 2;
if(n <= 5 )
n=0;

println(n);



Exemple :
Utiliser une instruction if après la clause if, sans accolades (ou toute autre instruction) ne pose pas de problème.

/**
* @author Kaesar ALNIJRES
*/
var s = "";
var n = 5;
if(n == 5)
s="{n}";
if(n != 5)
s="non équivalent";
println(s);



Exemple avec erreurs
Maintenant si l'expression if, avec instruction unique et sans accolades est suivie par une clause "else", le compilateur affiche une erreur. Pourquoi ?
/**
* @author Kaesar ALNIJRES
*/
var num = [1..10];
var n;
for(i in num)

if(i <= 0)
n="0";

//ici commence les erreurs
else if(i < 10)
n="0{i}";


else
n="{i}";


println(n);



Le compilateur considère tout simplement que c'est une expression if, format court. Dans ce format il ne faut utiliser le point virgule, car c'est une seule expression, et le point virgule sépare des expressions. L'expression globale se termine par point virgule ';'
et des accolades entourent l'expression for.

Exemple :

/**
* @author Kaesar ALNIJRES
*/
var num = [1..10];
var n;
for(i in num) {
if(i <= 0)
n="0"//pas de point virgule

else if(i < 10)
n="0{i}"//pas de point virgule


else
n="{i}";


println(n);

}



Utilisez un format court
Il est possible d'utiliser un format court, ce que j'ai fait dans la plupart d'exemple.

Au lieu de
==================
if(i < 0)
{ n="0";
}
else if(i < 10) {
n="0{i}";
}

else {
n="{i}";
}
===================

On peut utiliser
---------------------------------------------------------------------------
n = if(i < 0) "0" else if(i < 10) "0{i}" else "{i}";
----------------------------------------------------------------------------

Exemple :

/**
* @author Kaesar ALNIJRES
*/
var num = [1..10];
var n;
for(i in num)

{
n = if(i < 0) "0" else if(i < 10) "0{i}" else "{i}";
println(n);
}



Utilisez (si vous le voulez) "then"
Il est aussi possible d'utiliser "then" après une clause if. Il est aussi possible d'utiliser "then" après if et pas après else if etc ...

Exemple :

/**
* @author Kaesar ALNIJRES
*/
var i = 5;
var n = if(i < 0) "0" else if(i < 10) "0{i}" else "{i}";
println(n);

var m = if( i < 0 ) then "0" else if(i < 10) then "0{i}" else "{i}";
println(n);



Une expression if vide

Exemple :

/**
* @author Kaesar ALNIJRES
*/

var num=4;
if(num > 0)
{
println("Valeur positive");

}
else
{
println("Valeur négative")

}

Read more...

  © Blogger template Simple n' Sweet by Ourblogtemplates.com 2009

Back to TOP