25
Interfaces graphiques - JavaFX responsable : Wies law Zielonka [email protected] http://liafa.univ-paris-diderot.fr/zielonka March 2, 2016

Interfaces graphiques - JavaFX

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Interfaces graphiques - JavaFX

Interfaces graphiques - JavaFX

responsable : Wies law [email protected]

http://liafa.univ-paris-diderot.fr/∼zielonka

March 2, 2016

Page 2: Interfaces graphiques - JavaFX

Filtres et handlers

Stage

Scene

BorderPane

MenuBar

Pane

ToolBar

Rectangle Circle

Rectangle

event c

aptu

ring

event b

ubblin

g

EventHandler

EventHandler

ltres

EventHandler

EventHandler

handle

rs

addEventFilter

addEventHandler

Page 3: Interfaces graphiques - JavaFX

Construire, enregistrer et desenregistrer EventFilters

EventHandler<MouseEvent> f i l t r e =new EventHandler<MouseEvent>(){

pub l i c vo id hand l e (MouseEvent even t ){// imp lemente r l e f i l t r e// even t . consume ( ) ;

}} ;// e n r e g i s t r e rnode . a d dE v e n t F i l t e r ( MouseEvent .MOUSE CLICKED , f i l t r e ) ;

// d e s e n r e g i s t r e rnode . remove (MouseEvent .MOUSE CLICKED , f i l t r e ) ;

Page 4: Interfaces graphiques - JavaFX

Construire, enregistrer/desenregistrer EventHandlers

EventHandler<KeyEvent> hand l e r =new EventHandler<KeyEvent>(){

pub l i c vo id hand l e ( KeyEvent even t ){// imp lemente r l e f i l t r e// even t . consume ( ) ;

}} ;

// e n r e g i s t r e rnode . addEventHad le r ( KeyEvent .KEY TAPED, hand l e r ) ;

// d e s e n r e g i s t r e rnode . removeEventHad le r ( KeyEvent .KEY TAPED, hand l e r ) ;

Page 5: Interfaces graphiques - JavaFX

Methodes de commodite pour enregistrer un (seul)EventHadler

Au lieu d’enregistrer un handler avec

node . addEventHand le r (MouseEvent .MOUSE PRESSED,new EventHandler<MousePressed >(){

pub l i c vo id hand l e (MouseEvent even t ){ . . . }} ) ;

on peut utiliser une methode de commodite :

node . setOnMousePressed ( new EventHandler<MousePressed >(){pub l i c vo id hand l e (MouseEvent even t ){ . . . }

} ) ;

Les methodes de commodite ont le nom setOnTypeEvenement.

Page 6: Interfaces graphiques - JavaFX

Proprietes et ChangeListeners

CheckBox

BooleanProperty selected

ChangeListener<Boolean>

changed

checkBox . s e l e c t e dP r o p e r t y ( ) . a d dL i s t e n e r (new ChangeL i s t ene r<Boolean >(){

@Over r idepub l i c vo id changed (

Obse rvab l eVa lue<? extends Boolean> ob s e r v ab l e ,Boolean o l d v a l ,Boolean new va l ) {

. . . . . . .}

} ) ;

Page 7: Interfaces graphiques - JavaFX

La liste d’enfant d’un noeud

Si on a un noeud (par exemple Pane) de type Parent on lui ajouteun enfant avec add applique a la liste d’enfants :

pane . g e tCh i l d r e n ( ) . add ( en f an t ) ;

ObservableList<Node> getChildren() retourne la listed’enfants d’un noeud. La methode add() ajoute enfant a la finde la liste.

Quand le parent est rendu sur l’ecran les enfants sont rendus dansl’ordre de leur apparition sur la liste des enfants, le premier celui entete de la liste jusqu’au dernier, celui a la fin de la liste.

Page 8: Interfaces graphiques - JavaFX

La liste d’enfants

La liste obtenue par l’appel getChidren() est une vraie liste,toutes les operations habituelles sur les listes sont disponibles.Par exemple : supprimer le dernier element de la liste d’enfants :

L i s t l = pane . g e tCh i l d r e n ( ) ;l . remove ( l . s i z e ( ) − 1 ) ;

Page 9: Interfaces graphiques - JavaFX

L’ordre d’affichage d’enfants

Quand le parent est rendu sur l’ecran les enfants sont rendus dansl’ordre de leur apparition sur la liste des enfants, le premier celui entete de la liste jusqu’au dernier, celui a la fin de la liste.

Page 10: Interfaces graphiques - JavaFX

Systemes de coordonnees en JavaFX

Trois types de coordonnees :

I locales par rapport au noeud,

I scene - coordonnees par rapport a la scene,

I screen – coordonnees par rapport a l’ecran.

Page 11: Interfaces graphiques - JavaFX

Systemes de coordoonnees

x

y

loca

l de

Rect

angl

e

scre

en

scen

e

Page 12: Interfaces graphiques - JavaFX

Les systemes de coordonneesMouseEvent possede les methodes

I double getX(), double getY(),

I double getSceneX(), double getSceneY(),

I double getScreenX(), double getScreenY(),

qui donnent les coordonnees de l’evenement dans

I le systeme de coordonnees locales d’un noeud source del’evenement,

I par rapport au systeme de coordonnees de la scene,

I par rapport au systeme de coordonnees de l’ecran.

La classe Node possede les methodes

localToParent()

localToScene()

localToScreen()

qui permettent d’obtenir les coordonnees dans le systeme parent,scene, l’ecran a partir de coordonnees locaux d’un point.

Page 13: Interfaces graphiques - JavaFX

Fabriquer un noeud ”draggable”

p r i v a t e Node makeDraggable (Node node ) {c l a s s T {

double i n i t i a l T r a n s l a t e X , i n i t i a l T r a n s l a t e Y ,anchorX , anchorY ;

}

f i n a l T t = new T( ) ;

node . setOnMousePressed (new EventHandler<MouseEvent>() {@Over r idepub l i c vo id hand l e ( f i n a l MouseEvent even t ) {

t . i n i t i a l T r a n s l a t e X = node . g e tT ran s l a t eX ( ) ;t . i n i t i a l T r a n s l a t e Y = node . g e tT ran s l a t eY ( ) ;Point2D po i n t = node . l o c a lToPa r en t ( even t . getX ( ) ,

even t . getY ( ) ) ;t . anchorX = po i n t . getX ( ) ;t . anchorY = po i n t . getY ( ) ;}

} ) ;

Page 14: Interfaces graphiques - JavaFX

Fabriquer un noeud ”draggable” (suite)

node . setOnMouseDragged (new EventHandler<MouseEvent>() {@Over r idepub l i c vo id hand l e ( f i n a l MouseEvent even t ) {

Point2D po i n t = node . l o c a lToPa r en t ( even t . getX ( ) ,even t . getY ( ) ) ;

node . s e tT r an s l a t eX ( t . i n i t i a l T r a n s l a t e X −t . anchorX + po i n t . getX ( ) ) ;

node . s e tT r an s l a t eY ( t . i n i t i a l T r a n s l a t e Y −t . anchorY + po i n t . getY ( ) ) ;

}} ) ;re tu rn node ;}

Page 15: Interfaces graphiques - JavaFX

Propriete de translation

Proprietes de transltion d’un noeud dans les coordonnees locales :

Doub lePrope r ty t r a n s l a t eX , t r a n s l a t eY , t r a n s l a t e Z

que son parent utilise pour determiner ou dessiner le noeud.

Page 16: Interfaces graphiques - JavaFX

Utiliser ColorPicker

Co lo r shapeCo lo r = Co lo r .BLACK;

Co l o rP i c k e r p i c k e r = new Co l o rP i c k e r ( shapeCo lo r ) ;p i c k e r . se tOnAct ion (new EventHandler<Act ionEvent >() {

@Over r idepub l i c vo id hand l e ( Act ionEvent e ) {

Co lo r c = p i c k e r . ge tVa lue ( ) ;i f ( c != nu l l ) {

shapeCo lo r = c ;}

}} ) ;

Page 17: Interfaces graphiques - JavaFX

Faire un bord autour de Pane

pane . s e tBo rd e r (new Border (new Borde rS t roke (Co lo r .RED,Bo r d e r S t r o k eS t y l e . SOLID ,Co rn e rRad i i .EMPTY,

new BorderWidths ( 3 ) ) ) ) ;

Page 18: Interfaces graphiques - JavaFX

Clipping region

Un Rectangle mis dans Pane est dessine meme s’il sort de ce Pane!!!

Solution : definir ”clip” region dans Pane en utilisant la propriete :

Objec tPrope r ty<Node> c l i p

Par exemple :

pane . s e t P r e f S i z e (400 , 400 ) ;Rec tang l e c l i p = new Rec tang l e ( 400 , 400 ) ;pane . s e t C l i p ( c l i p ) ;

Page 19: Interfaces graphiques - JavaFX

Clipping region (suite)

Probleme : on veut que la taille de clipping region soit toujours lameme que la taille de Pane, c’est-a-dire les proprietes height etwidth du Rectangle soit toujours egales aux memes proprietes dePane.

Premiere solution : utiliser ChangeListener attaches aux proprieteswidth et height de Pane et modifie width et height de Rectangle.

Mais on peu bien mieux avec bind:

c l i p . h e i g h tP r op e r t y ( ) . b ind ( pane . h e i g h tP r o p e r t y ( ) ) ;c l i p . w i d thP rope r t y ( ) . b ind ( pane . w id thP rope r t y ( ) ) ;

Les changements de proprietes de clip suivent automatiquement leschangements de proprietes de pane.

Page 20: Interfaces graphiques - JavaFX

Creer un Text

Text t = new Text ( ) ;t . s e tFon t ( Font . f o n t ( ”Verdana” , 2 0 ) ) ;t . s e t F i l l ( s hapeCo lo r ) ; // c o l o rt . setX ( cx ) ; t . setY ( cy ) ; // p o s i t i o nt . s e tTex t ( s t r i n g ) ;pane . g e tCh i l d r e n ( ) . add ( t ) ;

Page 21: Interfaces graphiques - JavaFX

Recuperer KeyEvents

// i n s t a l l e r un f i l t r e ( ou un hand l e r )pane . a d dE v e n t F i l t e r ( KeyEvent .KEY TYPED, k e y F i l t e r ) ;pane . s e t F o c u sT r a v e r s a b l e ( t rue ) ;

Le controle qui possede un filtre ou handler pour l’evenementKeyEvent doit posseder le focus pour recevoir ces evenements.Mais Pane ne peut pas avoir de focus sauf si on le rend ”focustraversable” par

pane.setFocusTraversable(true);

Une fois pane est ”focus traversable” on peut demander le focusavec

pane.requestFocus()

Page 22: Interfaces graphiques - JavaFX

Definir un filtre ou handler pour le clavier

EventHandler<KeyEvent> keyEventHand l e r= new EventHandler<KeyEvent>() {

pub l i c vo id hand l e ( f i n a l KeyEvent keyEvent ) {// r e c u p e r e r l e c a r a c t e r e tape su r l e c l a v i e rS t r i n g s = even t . g e tCha r a c t e r ( ) ;

i f ( even t . i sCont ro lDown ( ) ) {System . e r r . p r i n t l n ( ”CONTROL DOWN” ) ;

}} } ;

Si l’evenement est de type keyEvent.KEY TYPED alors la methodeKeyEvent.getCharacter() retourne un String contenant lecaractere tape par l’utilisateur sur le clavier.

Pour les evenements KEY PRESSED et KEY RELEASED cettemethode retourne toujours CHAR UNDEFINED, donc elle est inutilepour ces deux evenements.

Page 23: Interfaces graphiques - JavaFX

La classe KeyEvent possede les methodes booleennesisControlDown(), isAltDown(), isShiftDown(),isMetaDown() qui permettent de tester si on a appuye sur une deces touches.

KeyEvent possede aussi la methode

KeyCode getCode()

qui retourne le code de la touche tape par l’utilisateur.

Mais cela ne concerne que les evenementsKeyEvent.KEY PRESSED et KeyEvent.KEY RELEASED. Pourl’evenement KeyEvent.KEY TYPED cette methode retournetoujours KeyCode.UNDEFINED.

Page 24: Interfaces graphiques - JavaFX

les effets visuels

I Blend Effect

I Bloom Effect

I Blur Effects

I Drop Shadow Effect

I Inner Shadow Effect

I Reflection

I Lighting Effect

I Perspective Effect

Page 25: Interfaces graphiques - JavaFX

Mis en oeuvre

Text t = new Text ( ) ;t . s e tTex t ( ” B l u r r y Text ! ” ) ;t . s e t F i l l ( Co l o r .RED) ;t . s e tFon t ( Font . f o n t ( ” n u l l ” , FontWeight .BOLD, 3 6 ) ) ;// p r e p a r e r l ’ e f f e tBoxBlur bb = new BoxBlur ( ) ;bb . setWidth ( 5 ) ;bb . s e tHe i g h t ( 5 ) ;bb . s e t I t e r a t i o n s ( 3 ) ;// s e t E f f e c tt . s e t E f f e c t ( bb ) ;