robotics.ucv.rorobotics.ucv.ro/carti/java/lab_android_javafx/laborator 1fx.docx  · web viewÎn...

17
JAVA FX JavaFX este un nou “framework” pentru dezvoltarea interfețelor grafice (GUI) .Acesta este un exemplu excelent de aplicarea a principiului de programare orientata pe obiecte. Swing si AWT sunt înlocuite de către platforma JavaFX pentru dezvoltarea RIA(rich internet application). JavaFX este un set de pachete grafice și multimedia care permite dezvoltatorilor proiectarea, testarea, depanarea precum și implementarea aplicațiilor bogate în conținut care ruleaza constant pe diverse platforme. Diagrama de arhitectură a JavaFx Interfața grafică în JavaFx este construită ca scena grafică. O scena grafică este o colecție de elemente vizuale, numite noduri.

Upload: nguyenque

Post on 18-Jul-2019

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

JAVA FX

JavaFX este un nou “framework” pentru dezvoltarea interfețelor grafice (GUI) .Acesta este un exemplu excelent de aplicarea a principiului de programare orientata pe obiecte. Swing si AWT sunt înlocuite de către platforma JavaFX pentru dezvoltarea RIA(rich internet application).

JavaFX este un set de pachete grafice și multimedia care permite dezvoltatorilor proiectarea, testarea, depanarea precum și implementarea aplicațiilor bogate în conținut care ruleaza constant pe diverse platforme.

Diagrama de arhitectură a JavaFx

Interfața grafică în JavaFx este construită ca scena grafică. O scena grafică este o colecție de elemente vizuale, numite noduri.

Page 2: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

Crearea unui proiect JavaFx

Se va descărca ultima versiunea de NetBeans.(Click pe NetBeans)File -> New Project...

Se selectează JavaFx -> JavaFx application -> Next

Se introduce numele proiectului, calea, JavaFx Platform: JDK 1.8, numele pachetului.

Page 3: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

Aplicația JavaFx poate fi compilată și rulată din interiorul programului NetBeans. Exista 3 posibilități de rularea : Rulare ca aplicație de sine stătătoare pentru desktop Rulare ca WebStart Rulare în browser

În NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate schimba modul prin care aplicația rulează din proprietății-le proiectului sub categoria Run. Pentru a accesa fereastra Properties Project, selectați proiectul, click dreapta, și selectați Properties. Se selectează Run din lista de categorii. Se introduc proprietățiile dorite pentru proiectul dvs.

Ciclul de viață al aplicației JavaFx

La momentul execuției JavaFx creează câteva fire de execuție (threads). Pe parcursul rulării aplicației, firele de execuție sunt folosite pentru a efectua diferite sarcini (taksuri). Printre altele JavaFx creează doua fire de execuție importante:

JavaFx-Launcher JavaFx Application ThreadMetoda launch() a clasei Application crează aceste fire de execuție. Pe parcursul timpului de

viață al aplicației JavaFx, JavaFx apelează urmatoarele metode specifice clasei Application în ordinea:

no-args constructor metoda init() metoda start() metoda stop()Metoda init() este neimplementată, deci se poate suprascrie în program.

Page 4: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

Firul de execuție JavaFx Application apelează metoda start() (Stage stage), metodă specifică clasei Application. Este o metodă abstractă deci poate fi suprascrisa în program.

În acest moment, metoda launc() așteaptă aplicația JavaFx sa se sfârșească. Când aplicația se termină, firul de execuție JavaFx Application apelează metoda stop(). Implementarea de bază a metodei stop() este “goală” în clasa Application, aceasta trebuie suprascrisă în program.

Urmatorul program prezintă ciclul de viață al aplicației JavaFx si pe UI un stagiu gol. În consolă este afișat ciclul de viață pe parcursul rulării.

package ace.ucv;

import javafx.application.Application;import javafx.scene.Group;import javafx.scene.Scene;import javafx.stage.Stage;

public class FXLifeCycleApp extends Application {

public FXLifeCycleApp() {String name = Thread.currentThread().getName();System.out.println("FXLifeCycleApp() constructor: " + name);}

public static void main(String[] args) {Application.launch(args);}

@Overridepublic void init() {String name = Thread.currentThread().getName();System.out.println("init() method: " + name);}

@Overridepublic void start(Stage stage) {String name = Thread.currentThread().getName();System.out.println("start() method: " + name);Scene scene = new Scene(new Group(), 200, 200);stage.setScene(scene);stage.setTitle("JavaFX Application Life Cycle");stage.show();}

@Override

Page 5: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

public void stop() {String name = Thread.currentThread().getName();System.out.println("stop() method: " + name);}

} Rezultat:

FXLifeCycleApp() constructor: JavaFX Application Threadinit() method: JavaFX-Launcherstart() method: JavaFX Application Thread

Ce este un Property ?

O clasa java conține doua tipuri de membrii: câmpuri si metode. Câmpurile reprezintă starea obiectelor și ele sunt declarate private. Metodele publice, știu-te și ca accesorii sau “getters” și “setters”, sunt folosite pentru a

citii și modifica valoarea campurilor declarate ca private.Pe scurt, o clasa Java care are metode de “getters” și “setters” este cunoscută ca și Java

“bean”, accesoriile definesc proprietățiile.

Structura de baza a unui program JavaFX:

Clasa java.fx.application.Application definește framework-ul pentru a scrie programe JavaFx.

Prima dumneavoastră aplicație JavaFx. Aceasta trebuie să afișeze textul “Hello World” în interiorul unui buton aflat în mijlocul ferestrei, la apăsarea acestuia va fi afisat la consola Ace.

O aplicație JavaFx este o clasă care trebuie să moștenească application care se afla în pachetul javafx.application. Veți numii clasa AutomaticaFxApp și va fi stocată în pachetul ace.ucv.

Mai jos este prezentat codul:

package ace.ucv;

import javafx.application.Application;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.layout.StackPane;import javafx.stage.Stage;

Page 6: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

public class AutomaticaFxApp extends Application implements EventHandler<ActionEvent>{ @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello word!"); Button btn = new Button(); //crearea butonului btn.setText("Say 'Hello World'"); //setarea textului din centru buttonului btn.setOnAction(this); //setarea functionalitati la apasarea acestui buton StackPane layout = new StackPane(); layout.getChildren().add(btn);//adaugarea butonului in scena Scene scene = new Scene(layout, 300, 250); //crarea scenei primaryStage.setScene(scene); //setarea scenei primaryStage.show(); //afisara scenei } @Override public void handle(ActionEvent event) { System.out.println("Hello World"); //afisarea Hello World in consola } //la apasarea butonului

public static void main(String[] args) { launch(args); }}

Page 7: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

În urmatorul exemplu se creează un buton, i se seteaza proprietățiile dupa care este adaugat în panou. Panoul este rotit cu 45 grade.

Cod sursa:

import javafx.application.Application;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.stage.Stage;import javafx.scene.layout.StackPane;

public class NodeStyleRotateDemo extends Application {

@Override public void start(Stage primaryStage) {

StackPane pane = new StackPane();Button btOK = new Button("OK");btOK.setStyle("-fx-border-color: blue;");pane.getChildren().add(btOK);

pane.setRotate(45);pane.setStyle( "-fx-border-color: red; -fx-background-color: lightgray;");Scene scene = new Scene(pane, 200, 250);primaryStage.setTitle("NodeStyleRotateDemo"); primaryStage.setScene(scene); primaryStage.show(); }public static void main(String[] args) { Application.launch(args); }}

Page 8: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

Prezentarea unor clase pentru desenarea unor forme geometrice:-linie javafx.scene.shape.Line;-dreptunghi javafx.scene.shape.Rectangle;

LiniaO linie unește două puncte definite de patru parametrii startX, startY, endX și endY. Mai

jos este prezentată diagrama pentru clasa Line.

Cod sursa:

package javafxapplication2;

import javafx.application.Application;import javafx.beans.value.ObservableValue;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Slider;import javafx.scene.paint.Color;import javafx.scene.shape.Line;import javafx.scene.shape.StrokeLineCap;import javafx.scene.text.Text;

Page 9: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

import javafx.stage.Stage;/*** Drawing Lines* Listing 2-1 DrawingLines.java* @author carldea*/public class DrawingLines extends Application { @Override public void start(Stage primaryStage) { primaryStage.setTitle("Chapter 2 Drawing Lines"); Group root = new Group(); Scene scene = new Scene(root, 300, 150, Color.GRAY); // Creare linie Line redLine = new Line(10, 10, 200, 10); // setarea proprietățiilor liniei redLine.setStroke(Color.RED); redLine.setStrokeWidth(10); redLine.setStrokeLineCap(StrokeLineCap.BUTT); // crearea unui model punctat redLine.getStrokeDashArray().addAll(10d, 5d, 15d, 5d, 20d); redLine.setStrokeDashOffset(0); root.getChildren().add(redLine); // creare linie Line whiteLine = new Line(10, 30, 200, 30); //setarea proprietăți whiteLine.setStroke(Color.WHITE); whiteLine.setStrokeWidth(10); whiteLine.setStrokeLineCap(StrokeLineCap.ROUND); root.getChildren().add(whiteLine); // creare linie Line blueLine = new Line(10, 50, 200, 50); blueLine.setStroke(Color.BLUE); blueLine.setStrokeWidth(10); root.getChildren().add(blueLine); // slider pentru schimbarea valoriilor Slider slider = new Slider(0, 100, 0); slider.setLayoutX(10); slider.setLayoutY(95);

Page 10: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

// legarea proprietatiilor liniei punctate redLine.strokeDashOffsetProperty() .bind(slider.valueProperty()); root.getChildren() .add(slider); //creare text Text offsetText = new Text("Stroke Dash Offset: 0.0"); offsetText.setX(10); offsetText.setY(80); offsetText.setStroke(Color.WHITE); // afișarea slider.valueProperty() .addListener((ov, curVal, newVal) -> offsetText.setText("Stroke Dash Offset: " + slider.getValue())); root.getChildren().add(offsetText); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }

Schimbarea fondului pentru text

Page 11: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

JavaFx permite schimbarea stilului pentru font și a mărimi textului. Mai jos este prezentată o aplicație JavaFx care afișează patru texte “JavaFX8 : Exemplu”, fiecare având fonturi diferite iar unele dintre ele au adăugate efecte cum ar fi umbra pentru text (DropShadow) și reflexie a textului (TextReflection).

Cod sursă:

package javafxapplication2;

import javafx.application.Application;import static javafx.application.Application.launch;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.effect.DropShadow;import javafx.scene.effect.Reflection;import javafx.scene.paint.Color;import javafx.scene.text.Font;import javafx.scene.text.Text;import javafx.stage.Stage;

public class SchimbareFont extends Application{ @Override public void start(Stage primaryStage) { primaryStage.setTitle("Schimbarea fontului"); System.out.println("Font: "); Font.getFamilies().stream() .forEach( i -> System.out.println(i)); System.out.println("Nume font: "); Font.getFontNames().stream() .forEach( i -> System.out.println(i)); Group root = new Group(); Scene scene = new Scene(root, 580, 250, Color.WHITE); // Setare font "Serif" cu umbre Text text2 = new Text(50, 50, "JavaFX8 : Exemplu"); Font serif = Font.font("Serif", 30); text2.setFont(serif); text2.setFill(Color.RED); DropShadow dropShadow = new DropShadow(); dropShadow.setOffsetX(2.0f); dropShadow.setOffsetY(2.0f);

Page 12: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

dropShadow.setColor(Color.rgb(50, 50, 50, .588)); text2.setEffect(dropShadow); root.getChildren().add(text2); // Setare font "SanSerif" Text text3 = new Text(50, 100, "JavaFX8 : Exemplu"); Font sanSerif = Font.font("SanSerif", 30); text3.setFont(sanSerif); text3.setFill(Color.BLUE); root.getChildren().add(text3); // Setare font "Dialog" Text text4 = new Text(50, 150, "JavaFX8 : Exemplu"); Font dialogFont = Font.font("Dialog", 30); text4.setFont(dialogFont); text4.setFill(Color.rgb(0, 255, 0)); root.getChildren().add(text4); // Setare font "Monospaced" cu reflexie Text text5 = new Text(50, 200, "JavaFX8 : Exemplu"); Font monoFont = Font.font("Monospaced", 30); text5.setFont(monoFont); text5.setFill(Color.BLACK); root.getChildren().add(text5); // Setare reflexie Reflection refl = new Reflection(); refl.setFraction(0.8f); refl.setTopOffset(5); text5.setEffect(refl); primaryStage.setScene(scene); primaryStage.show();}public static void main(String[] args) { launch(args); }}

Page 13: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

Chestiuni de studiat

1.Modificați primul program pentru a afișa “ACE Craiova” în locul textului “Hello JavaFX”.

2.Modificați programul de mai sus astfel încat să mai adaugați un buton cu textul “ACE”, la apasarea acestuia pe consolă va aparea “Hello ACE Craiova”.

Page 14: robotics.ucv.rorobotics.ucv.ro/carti/java/Lab_Android_JavaFX/Laborator 1FX.docx  · Web viewÎn NetBeans rularea de bază este ca aplicație de sine stătătoare desktop. Se poate

3.Realizați un program cu 2 butoane si 2 texte, la apasarea butonului se va schimba atât textul cât și stilul fiecarui text.

@Override public void start(Stage primaryStage) { Button btn = new Button(); //crarea butonului btn.setText("Say 'Hello World'"); //setarea textului din centru butonului

btn.setOnAction(new EventHandler<ActionEvent>() { //setarea funcționalități // la apasarea acestuia

@Override public void handle(ActionEvent event) { btn.setText("Java"); Font dialogFont = Font.font("Dialog", 30); btn.setFont(dialogFont);

System.out.println("Hello World"); //afișarea Hello World în consolă } //la apasarea butonului