Laborator 1FX
Laborator 1FX
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.
Interfața grafică în JavaFx este construită ca scena grafică. O scena grafică este o colecție
de elemente vizuale, numite noduri.
Crearea unui proiect JavaFx
Se introduce numele proiectului, calea, JavaFx Platform: JDK 1.8, numele pachetului.
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.
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 Thread
Metoda 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.
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.
package ace.ucv;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
public FXLifeCycleApp() {
String name = Thread.currentThread().getName();
System.out.println("FXLifeCycleApp() constructor: " + name);
}
@Override
public void init() {
String name = Thread.currentThread().getName();
System.out.println("init() method: " + name);
}
@Override
public 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
public void stop() {
String name = Thread.currentThread().getName();
System.out.println("stop() method: " + name);
}
}
Rezultat:
Ce este un Property ?
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.
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;
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
Cod sursa:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.layout.StackPane;
@Override
public void start(Stage primaryStage) {
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);
}
}
Prezentarea unor clase pentru desenarea unor forme geometrice:
-linie javafx.scene.shape.Line;
-dreptunghi javafx.scene.shape.Rectangle;
Linia
O 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;
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);
// 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);
//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();
}
Schimbarea fondului pentru text
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;
@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));
// 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);
}
}
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”.
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
@Override
public void handle(ActionEvent event) {
btn.setText("Java");
Font dialogFont = Font.font("Dialog", 30);
btn.setFont(dialogFont);