Upload
others
View
20
Download
1
Embed Size (px)
Citation preview
Laboratorul 03Dezvoltarea interfețelor grafice cu utilizatorul
folosind tehnologia JavaFX
Aplicaţii Integrate pentru Întreprinderi (AIPI)Semestrul de Toamnă 2014
Departamentul de Calculatoare
Conținut JavaFX – aspecte generale
Arhitectura JavaFX
Structura Generală a unei aplicații JavaFX
Componente ale Interfeței cu Utilizatorul
o Controale Grafice
o Gestiunea Meniurilor
o Diagrame
o Elemente de tip Text
o Controale pentru Pagini Internet
o Mecanisme de Dispunere a Conținutului
o Foi de Stil
o Gestiunea Evenimentelor
o Conținut Multimedia
Dezvoltarea unei Interfețe Grafice în Mod Vizual
o FXML
o Scene Builder 2.0
Modele de Date asociate Controalelor JavaFX
Gestiunea Concurenței in JavaFX
Recomandări cu privire la Implementarea Aplicațiilor JavaFX
JavaFX – aspecte generale interfață de programare a sistemelor informatice ce presupun interacțiunea cu utilizatorul
◦ aplicații multimedia avansate
◦ destinate organizațiilor bazate pe date
◦ comportament consistent pe mai multe platforme de dezvoltare (Windows / Linux / Mac OS X / ARM)
integrare cu limbajul de programare Java, optimizând◦ inclus în JRE / JDK, începând cu versiunea 8
◦ costurile legate de investiții
◦ complexitatea sistemelor dezvoltate
Caracteristicile JavaFX 8 integrare Java – alternative JRuby / Scala;
limbajul declarativ de adnotare FXML si utilitarul SceneBuilder 2o FXML – dezvoltarea interfeței grafice separând complet nivelul de prezentare
de nivelul de logică a aplicației;
o SceneBuilder 2.0 – instrument de dezvoltare vizuală a interfețelor grafice, generând automat documentul FXML;
componente WebView – integrarea paginilor Internet în cadrulinterfețelor grafice folosind WebKitHTML
interoperabilitate cu tehnologia Swing – clasa SwingNode
biblioteci de controale ce pot fi particularizate prin foi de stil
tema Modena
grafică 3D: Shape3D, SubScene, Material, PickResult, LightBase, SceneAntiAliasing, Camera
Caracteristicile JavaFX 8(cont’d) desenarea pe o suprafață dintr-o scenă JavaFX folosind API-ul Canvas;
API pentru tipărire – javafx.print;
suport pentru text stilizat;
suport pentru operatii multi-touch;
suport pentru dispozitive de afișare HiDPI;
Prism – motor grafic accelerat la nivel hardware pentru anumite componente recomandate;
GStreamer – motor multimedia performant;
model de dezvoltare a aplicațiilor autonome
Arhitectura JavaFX
Sursa: Understanding the JavaFX Architecture,http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-architecture.htm
bazată pe o stivă de componente transparentă pentru utilizator Quantum Toolkit = motorul ce rulează codul sursă propriu-zis
o Prism – motor grafic performanto Glass – sistem eficient de ferestreo motor pentru redarea conținutului multimediao motor pentru redarea paginilor Internet
setul de API-uri Java pentru funcționalități JavaFXo clase generice, adnotări, lucrul cu mai multe fire de execuție,
expresii Lambdao acces la JavaFX din alte limbaje de programare (JavaScript, Groovy)o acces la alte limbaje de programare bazate pe JVM pentru dezvoltarea de
aplicații JavaFXo biblioteci de asocierio biblioteci de colecții (list / map) ce conectează modelul de date cu elementele
din interfața grafică
graful de scene – structură ierarhică de noduri, fiecare nod fiind identificat în mod unic, având o clasă de stil și un volum delimitator
o noduri – forme 2D/3D, imagini, conținut multimedia / Internet, text, controale pentru interacțiunea cu utilizatorul, grafice, containere
o stări - transformări (poziționări / orientări), efecte vizualeo efecte – obiecte care specifică aspectul nodurilor (umbre, mecanisme de
estompare, reglarea culorilor)
Arhitectura JavaFX (cont’d)
Arhitectura JavaFX (cont’d) controale
◦ definite in pachetul javafx.scene.control
◦ pot fi grupate in containere / panouri◦ BorderPane
◦ HBox / VBox
◦ StackPane
◦ GridPane
◦ FlowPane
◦ TilePane
◦ AnchorPane
stilizarea continutului folosind foi de stil◦ versiunea 2.1 a W3C CSS + elemente din versiunea 3
◦ pot fi aplicate oricarui obiect de tip Node
◦ proprietățile JavaFX prefixate de –fx–
Arhitectura JavaFX (cont’d) transformări – definite în javafx.scene.transform, affine() = mapare
între sisteme de coordonate menținând paralelismul / ortogonalitatea
◦ translate()
◦ scale()
◦ shear()
◦ rotate()
efecte vizuale – definite în javafx.scene.effect◦ operează la nivel de pixel al imaginii
◦ Bloom, Blur (BoxBlur, MotionBlur, GaussianBlur), DropShadow / InnerShadow, Reflection, Lightning, Perspective
Arhitectura JavaFX (cont’d) sistemul grafic – obiecte 2D/3D randate software dacă hardware-ul nu are capabilitățile necesareo Prism – operații de redare / rasterizare a conținutului folosind Windows XP/Vista: DirectX 9
Windows 7: DirectX 11
Mac, Linux, dispozitive mobile: OpenGL
daca nu există accelerare grafică: Java 2D
oQuantum Toolkit – element de interfață între Prism si sistemul de ferestre Glass
Glass – gestiunea ferestrelor, suprafețe, mecanisme de cronometrare, evenimente intrare/ieșireo coada de evenimente a sistemului de operare gazdă
Arhitectura JavaFX (cont’d)
firele de execuție – minim 2◦ al aplicației JavaFX: gestiunea scenelor afișate curent, pregătirea scenelor
în fundal
◦ Prism: folosit pentru redare◦ evenimentele de intrare/ieșire tratate separat
◦ se pot asocia fire de execuție separate pentru rasterizare
◦ pentru continut multimedia
sincronizarea – mecanismul Pulse◦ indică faptul că elementele din graful de scene trebuie sincronizate
◦ se declanșează la maxim 60fps sau oricând sunt modificări în graful de scene
◦ elementele de dispunere a conținutului / legate de stil sunt parcurse doar o singură dată → performanța!!!
Arhitectura JavaFX (cont’d) suport multimedia: javafx.scene.media
◦ continut audio-vizual (.mp3, .aiff, .wav, .flv)
◦ componente: Media, MediaPlayer, MediaView
navigator încorporat◦ bazat pe WebKit
◦ suportă HTML5, CSS, JavaScript, DOM și SVG
◦ functionalități◦ redare / editare conținut HTML
◦ istoric navigare
◦ execuție comenzi JavaScript din JavaFX și acces la obiecte JavaFX din JavaScript
◦ componente: WebEngine, WebView
Structura unei aplicații JavaFX
extinde javafx.application.Application
metoda start(Stage) este apelată în momentul execuției aplicației JavaFX
o aplicație JavaFX se exprimă în termeni de obiecteo javafx.stage.Stage
o javafx.scene.Scene
Structura unei aplicații JavaFX(cont’d)
fiecare element din cadrul unei scene este un nod dintr-un arbore în care rădăcina este container-ulo Scene – nod rădăcină
o Parent – noduri de tip ramură
o Node – noduri frunză (javafx.scene.shape / javafx.scene.text)
Structura unei aplicații JavaFX(cont’d)
Bookstore.java
public class BookStore extends Application {
@Override
public void start(Stage mainStage) throws Exception {
new Authentication().start();
}
public static void main(String[] args) {
launch(args);
}
}
Structura unei aplicații JavaFX(cont’d)
Authentication.java
public class Authentication {
private Stage applicationStage;
private Scene applicationScene;
public void start() {
try {
applicationScene =
new Scene((Parent)FXMLLoader.load(getClass().getResource(Constants.AUTHENTICATION_FXML)));
} catch (Exception exception) {
System.out.println ("An exception has occured: "+exception.getMessage());
if (Constants.DEBUG)
exception.printStackTrace();
}
applicationStage = new Stage();
applicationStage.setTitle(Constants.APPLICATION_NAME);
applicationStage.getIcons().add(
new Image(getClass().getResource(Constants.ICON_FILE_NAME).toExternalForm()));
applicationStage.setScene(applicationScene);
applicationStage.show();
}
}
Construirea de interfețe grafice cu ajutorul controalelor JavaFX definite în pachetul javafx.scene.control
majoritatea tipurilor de controale întâlnite în interfețele cu utilizatorul◦ Accordion◦ ColorPicker◦ Chart◦ DatePicker◦ Pagination◦ TitledPane◦ TreeTableView
sunt noduri în graful de scene – pot fi integrate în animații, efecte, transformări, tranziții
pot particularizate – fiind derivate din clasa Node◦ CSS (foi de stil)◦ folosind clasa Skin
Clasa Label etichetă non-editabilă
poate conține◦ un text
◦ o imagine
metode◦ setText(String text)
◦ setGraphic(Node graphic)
◦ alinieri setTextAlignment()
setContentDisplay() - (ContentDisplay: LEFT, RIGHT, CENTER, TOP, BOTTOM)
setWrapText(), setTextOverrun()
setFont() – set de caractere, setTextFill() – culoare
setGraphicTextGap() – distanța dintre imagine și etichetă
Clasa Button produce o acțiune în momentul în care este apăsat, care trebuie tratată printr-o metodă asociată evenimentului, atașată obiectului addEventHandler()o frecvent, ActionEvent (apăsarea butonului)o alte tipuri de evenimente: MouseEvent.MOUSE_ENTERED, MouseEvent.MOUSE_EXITED
button.setOnAction((ActionEvent event) -> {
// ...}
);
derivat din clasa Labeled, conține text / imagine
operații: rotire, translatare, scalare, tăiere
efecte – setEffect(), pachetul javafx.scene.effect
stilizare: setSyleClass(), setStyle()
ClaseleRadioButton / ToggleButton RadioButton – există o singură selecție, ToggleButton – poate exista nici un buton selectat
două stări: selectat, deselectat – starea obținută prin isSelected()o setSelected()
o requestFocus()
grupate intr-un obiect de tip ToggleGroup, care asigură excluderea mutuală între controalele conținute – setToggleGroup()
modificarea selecției poate fi monitorizată printr-un obiect ascultător ChangeListener
final ToggleGroup toggleGroup = new ToggleGroup();
toggleGroup.selectedToggleProperty().addListener(
(ObservableValue<? extends Toggle> observableValue, Toggle oldToggle, Toggle newToggle) -> {
if (toggleGroup.getSelectedToggle() != null) {
Toggle selectedToggle = toggleGroup.getSelectedToggle();
// ...
}
}
);
Clasa CheckBox stare
◦ definit – poate fi selectat/deselectat
◦ nedefinit – trebuie precizată proprietatea allowIndeterminate
nu pot fi grupate în obiecte de tip ToggleGroup
metode◦ setSelected()
◦ setIndeterminate() – ciclare intre trei valori
Clasa ChoiceBox selecția dintre un număr relativ mic de opțiuni
elementele componente◦ create prin metoda FXCollections.observableArrayList()
◦ specificate◦ în constructor
◦ ca parametru al metodei setItems()
◦ separarea se poate face prin obiecte Separator
explicații suplimentare: Tooltip / setTooltip()
monitorizarea modificării selecției – ChangeListener<Number> / changed()
choiceBox.getSelectionModel().selectedIndexProperty().addListener(
(ObservableValue observableValue, Number oldValue, Number newValue) -> {
int selectedIndex = newValue.intValue();
// ...
}
);
ClaseleTextField / PasswordField derivate din clasa TextInput
controale prin care se preia un text de la utilizator
TextField – textul este vizibil în clar, PasswordField – caracterele sunt înlocuite prin ●
vizualizare◦ setPrefColumnCount() – dimensiunea◦ setPromptText() – text descriptiv (semnificația continutului)
metode◦ copy()◦ cut()◦ selectAll()◦ paste()◦ clear()
monitorizarea modificării conținutului se face printr-un obiect EventHandler<ActionEvent>
Clasa ScrollBar panouri / zone de vizualizare care pot fi derulate
elemente componente◦ cursor
◦ bara culisantă
◦ butoane stâng/drept
metode◦ setMin() / setMax() – limitele între care se mișcă cursorul
◦ setValue() – valoarea curentă (implicit, (min + max) / 2)
◦ setOrientation() – orientare pe orizontală / verticală
◦ deplasarea la apăsarea pe butoanele laterale: UNIT_INCREMENT
◦ deplasarea la apăsarea pe bara culisantă: BLOCK_INCREMENT
Clasa ScrollPane vizualizări ale controalelor a căror dimensiune depășește suprafața de afișare, acestea putând fi derulate folosind elemente culisante (ScrollBar)
conține un singur element (pentru mai multe elemente, se folosește Group)
setPannable() – previzualizarea conținutului simultan cu mișcarea mouse-ului
proprietăți – HVALUE, VVALUE: poziția pe care o are cursorul pe orizontală / verticală
metode◦ setContent()◦ setHbarPolicy() / setVbarPolicy()
◦ ScrollBarPolicy: ALWAYS, NEVER, AS_NEEDED
◦ setFitToWidth() / setFitToHeight() – redimensionare pentru încadrarea în spațiul existent (implicit, FIT_TO_WIDTH, FIT_TO_HEIGHT au valoarea false)
◦ dimensiunile minimă, maximă, curentă ale obiectului conținut
Clasa ListView vizualizarea unei liste care conține mai multe obiecte, astfel încât pentru inspectarea sa este necesară existența unei bare derulante
definire◦ în constructor
◦ setItems() – FXCollections.observableArrayList()
◦ setCellFactory()
metodeo setPrefWidth() / setPrefHeight()
o setOrientation() –Orientation.HORIZONTAL, Orientation.VERTICAL
Clasa ListView (cont’d) clasa SelectionModel – determină selecția din cadrul listei
◦ getSelectionModel().getSelectedIndex()
◦ getSelectionModel().getSelectedItem()
clasa FocusModel – determină focusul din cadrul listei◦ getFocusModel().getFocusedIndex()
◦ getFocusModel().getFocusedItem()
implicit, modelul de selecție este MultipleSelectionModel, cu proprietatea selectionMode = SelectionMode.SINGLE
pentru obținerea valorilor din selecții multiple sunt folosite metodele selectedItems() / selectedIndices()o setSelectionMode(SelectionMode.MULTIPLE)
extensii ale clasei ListCell: “fabrici” de celule – se permite ca utilizatorul să modifice conținutulo CheckBoxListCell, ChoiceBoxListCell, ComboBoxListCell, TextFieldListCell
Clasele TableView,TableColumn și TableCell construirea
◦ definirea unui model pentru tabel
◦ asocierea unei fabrici de celule pentru fiecare coloană în parte – metoda setCellValueFactory() – PropertyValueFactory utilizând denumirile coloanelor ca referințe către metodele clasei model
TableColumn – coloane ale tabeluluio vizibilitatea unei coloane poate fi specificată (setVisible())
o se pot defini coloane imbricate
TableColumn parent = new TableColumn("Parent");
TableColumn child1 = new TableColumn("Child1");
TableColumn child2 = new TableColumn("Child2");
parent.getColumns().addAll(child1, child2);
Clasele TableView,TableColumn și TableCell(cont’d)
operațiio sortarea datelor setSortable()
metoda setSortType (TableColumn.SortType: ASCENDING, DESCENDING), TableView.sortOrder()
numărul de click-uri ale mouse-ului (1 – crescător, 2 – descrescător, 3 – deloc), Shift + Click stabilește ordinea
o redimensionarea coloanelor
o editarea conținutului - setEditable()
o setPlaceHolder() – mesajul afișat în cazul în care tabelul nu conține date (implicit No content in table)
Clasa TreeView vizualizarea de conținuturi ce respectă o structură ierarhică
obiecte de tip TreeItem între care se stabilesc relații de tip părinte-fiu◦ rădăcina specificată prin metoda setRoot() sau în constructorul obiectului TreeView
◦ relațiile dintre noduri – metoda add() / addAll() adăugată pe lista observabilă a componentelor (obținută cu getChildren())
◦ verificarea relațiilor: getParent() / isLeaf()
◦ expandarea conținutului – setExpanded(), implicit nu este vizibil
◦ poate contine orice tip de date / controaleTreeItem<T> (T value)
◦ setGraphic() – asocierea unui element grafic
Clasa TreeView(cont’d) TreeItem – nu este derivate din clasa Nodeo nu se pot aplica efecte vizuale
omecanism de tip “fabrică” pentru generarea de obiecte TreeCell CheckBoxTreeCell, ChoiceBoxTreeCell, ComboBoxTreeCell, TextFieldTreeCell
util când
• obiectul conține o cantitate mare de informații modificată dinamic
• se dorește redefinirea tipului de control cu specificarea comportamentului la interacțiunea cu utilizatorul
Clasa TreeTableView TreeTableView = TableView + TreeView
construirea
o 1) definirea nodurilor (TreeItem) din cadrul arborelui
final TreeItem<String> childNode1 = new TreeItem<>(new Person("FirstName1, LastName1"));
final TreeItem<String> childNode2 = new TreeItem<>(new Person("FirstName2, LastName2"));
o 2) specificarea nodului rădăcină
final TreeItem<String> rootNode = new TreeItem<>("Persons");
rootNode.setExpanded(true);
o 3) stabilirea relațiilor de tip părinte-copil între nodurile din cadrul arborelui
rootNode.getChildren().setAll(childNode1, childNode2);
o 4) definirea coloanelor (TreeTableColumn)
TreeTableColumn<Person, String> firstNameColumn = new TreeTableColumn<>("First Name");
TreeTableColumn<Person, String> lastNameColumn = new TreeTableColumn<>("Last Name");
o 5) specificarea conținutului coloanelor, prin fabrici de celule – furnizează obiecte TreeItem
firstNameColumn.setCellValueFactory((CellDataFeatures<Person, String> parameter) ->
new ReadOnlyStringWrapper(parameter.getValue().getValue().getFirstName()));
lastNameColumn.setCellValueFactory((CellDataFeatures<Person, String> parameter) ->
new ReadOnlyStringWrapper(parameter.getValue().getValue().getLastName()));
o 6) construirea unui obiect TreeTableView
final TreeTableView<String> treeTableView = new TreeTableView<>(rootNode);
treeTableView.setShowRoot(true);
o 7) asocierea coloanelor la obiectul TreeTableView
treeTableView.getColumns().addAll(firstNameColumn, lastNameColumn);
setShowRoot() – vizibilitatea nodului rădăcină
setTableMenuButtonVisible() – accesul utilizatorilor la vizibilitatea coloanelor (butonul +)
Clasa TreeTableView(cont’d)
Clasa TreeTableView(cont’d)
ordonarea conținutuluio pentru fiecare coloană în parte setSortType() – TreeTableColumn.SortType
(ASCENDING, DESCENDING)
o pentru întregul tabel – setSortMode() TreeSortMode.ALL_DESCENDANTS
TreeSortMode.ONLY_FIRST_LEVEL
Clasa TreeTableView(cont’d) selecția conținutuluio implicit, MultipleSelectionModel – SelectionMode.SINGLE
o selecții multiple – setSelectionMode() + setCellSelectionEnabled()
Clasa ComboBox folosită pentru selectarea unei opțiuni dintr-o listă ce depășește o anumită limită (folosește elemente derulante)
conținut – listă observabilă◦ constructor◦ setItems(…)
◦ getItems().addAll(…)
!!! A nu se popula cu controale din clasa Node, ci se utilizează “fabrici” de celule (setCellFactory())
metode◦ {get|set}Value() – specificarea elementului curent modifică obiectul asociat din proprietatea selectionModel
◦ setVisibleRowCount()
◦ setEditable(), setPromptText()
Clasa Separator delimitează elementele unui grup, structurează interfața grafică
nu produce nici o acțiune
metode◦ setOrientation() – orientarea (orizontală / verticală)
◦ setMaxWidth() – dimensiunea
◦ setHalignement() / setValignement() – poziția pe Ox / Oy
derivat din clasa Node, poate fi stilizat
Clasa Slider elemente componente: pistă, cursor, marcaje cu etichete asociate
metode – comune cu ale clasei ScrollPane◦ setMin() / setMax() – valorile extreme
◦ {get|set}Value() – valoarea curentă a cursorului (double)
◦ setShowTickLabels(), setShowTickMarks() – modul de vizualizare al cursorului (asociază etichete gradațiilor)
◦ setMinorTickCount(), setMajorTickCount()
◦ setBlockIncrement() – distanța cu care se mișcă cursorul atunci când utilizatorul apasă pe pista asociată
◦ setSnapToTicks() – alinierea cursorului cu marcajele din cadrul pistei
Clasele ProgressIndicatorși ProgressBar indică faptul că o sarcina este în curs de execuție precum și cantitatea care a fost deja realizatăo ProgressIndicator – grafic circular al cărui conținut este umplut
o ProgressBar – bară a cărei suprafață este umplută subclasă a ProgressIndicator
transmitere valoare (subunitară)◦ constructor
◦ metoda setProgress()
◦ proprietatea progressProperty
◦ în situația în care nu se poate evalua dimensiunea sarcinii în cauză◦ nu se specifică nici o valoare în constructor / valoare negativă
◦ isIndeterminate()
Clasa Hyperlink formatează texte care au semnificația unei legături către o pagină Interneto derivată din clasa Labeled setText(), setGraphic()
starea obiectului – setVisited()
tratarea evenimentului de vizitare – setOnAction()
Hyperlink hyperlink = new Hyperlink();String URL = "http://aipi2014.andreirosucojocaru.ro";hyperlink.setText(URL);hiperlink.setOnAction((ActionEvent actionEvent) -> {
new WebView().getEngine().load(URL);}
);
Clasa HTMLEditor editor de texte cu funcționalități pentru redactarea documentelor HTML5
functionalități◦ formatare de text (bold, italic, underline, striketrough)
◦ configurari paragraf (formatare, tip, dimensiune caractere)
◦ culori fundal
◦ indentare text
◦ liste numerotate / nenumerotate
◦ riglă orizontală
◦ copy/paste
metode◦ setPrefWidth() / setPrefHeight()
◦ {get|set}HtmlText() –codul HTML asociat
◦ WebEngine.load() – vizualizarea conținutului într-un navigator
derivat din clasa Node, i se pot aplica stiluri, efecte vizuale, transformări
Clasa Tooltip texte explicative ce pot fi asociate oricăror controale din pachetul javafx.scene.control
asocierea unui astfel de obiect se face prin metoda setTooltip()
stări◦ 1) activat
◦ 2) vizibil
◦ există o decalare la trecerea între cele două stări
ștergerea textului explicativ se face cu uninstall()
derivat din Labeled, i se poate asocia text
imagine
ClaseleTitledPane / Accordion panouri care au asociat un titlu, încapsulând un obiect de tip Nodeo textul și conținutul pot fi transmise în constructor
o setText(), setContent()
pot fi deschise și închiseo setCollapsible() – implicit poate fi deschis / închis
o setAnimated() – animație asociată tranziției
sunt grupate in obiecte de tip Accordion (unde doar un obiect TitledPane poate fi vizualizat la un moment)o nu se specifică înălțimea (minimă / maximă / preferată) a obiectelor TitledPane întrucât pot apărea probleme în momentul expandării
o {set|get}ExpandedPane() – obiectul TitledPane vizualizat în mod curent
ClaseleTitledPane / Accordion(cont’d) obiectul ascultător (ChangeListener<TitledPane>) pentru
evenimentul de modificare a selecției se asociază metodei expandedPaneProperty()
Accordion accordion = new Accordion();TitledPane titledPane1 = new TitledPane(), titledPane2 = new TitledPane();// ...titledPane1.setContent(...);titledPane2.setContent(...);accordion.getPanes().add(titledPane1);accordion.getPanes().add(titledPane2);accordion.expandedPaneProperty().addListener(
(ObservableValue<? extends TitledPane> observableValue, TitledPane oldValue, TitledPane newValue) -> {
// ...}
);
Clasa ColorPicker permite selecția unei culori dintr-o anumită gamă sau specificarea acesteia prin parametrii RGB / HSB
componente: lista pentru selecția culorii, paleta de culori, fereastra de dialog pentru specificarea parametrilor
metodeo {set|get}Value() – culoarea curentă culori pedefinite în clasa Color
metodele statice rgb() / hsb() / web()
o getCustomColors() –> ObservableList<Color>: nu pot fi reîncărcate la repornirea aplicației decât prin adoptarea unui mecanism de persistență
vizualizare: implicit javafx.scene.control.skin.ColorPickerSkino stiluri: ArrowButton, SplitButton
o Redefinirea proprietății -fx-skin a clasei CSS .color-picker
Clasa DatePicker permite selecția unei date dintr-un anumit calendar
componente: ComboBox editabil având un câmp dată calendaristică, zonă de selecție a unei date dintr-un calendar
populareo constructor fără parametri / obiect LocalDate ce indică data calendaristică
selectată implicit
o setValue()
o LocalDate.now()
metodeo setShowNumberOfWeeks() – afișarea săptămânii în cadrul calendarului
o setChronology() – sisteme de calendare alternative (japonez, Hijrah, Minguo, tailandeze-budiste)
Clasa DatePicker(cont’d) datele calendaristice sunt reprezentate în formatul definit de sistemul local (mm/dd/yyyy)
modificarea formatului se face prin metoda setConverter()o null – formatul implicit
private DatePicker datePicker = new DatePicker(LocalDate.now());private final String dateFormat = "dd.mm.yyyy";StringConverter converter = new StringConverter<LocalDate>() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat);@Overridepublic String toString(LocalDate localDate) {
if (localDate != null) {return dateTimeFormatter.format(localDate);
return "";}@Overridepublic LocalDate fromString(String string) {
if (string != null && !string.isEmpty())return LocalDate.parse(string, dateTimeFormatter);
return null;}
};datePicker.setConverter(converter);datePicker.setPromptText(dateFormat.toLowerCase());
Clasa DatePicker(cont’d) schimbarea funcționalității unui obiect DatePicker se face prin atașarea unei fabrici de celule care generează obiecte DateCellcu comportamentul dorito exemplu: dezactivarea anumitor valori (setDisabled())
datePicker.setDayCellFactory(new Callback<DatePicker, DateCell>() {
@Override
public DateCell call(final DatePicker) {
return new DateCell() {
@Override
public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
// ...
}
};
}
});
Clasa Pagination navigarea între mai multe pagini corespunzând unui conținut împărțit între mai multe secțiunio utilitate în cazul dispozitivelor mobile
elemente componenteo conținutul paginiio zona de navigare butoane pentru deplasarea înainte/inapoi
butoane pentru fiecare pagină în parte
etichetă de forma “pagina curentă / număr total de pagini”
populareo constructor: fără parametri (numărul de pagini INDETERMINATE), sau
cu 1-2 parametri (număr pagini, pagina curentă)o setPageCount(), setCurrentPageIndex()
setMaxPageIndicatorCount() – limitarea legăturilor vizibile către numărul de pagini
Clasa Pagination (cont’d) specificarea conținutului – prin intermediul unei fabrici de pagini – setPageFactory()o trebuie să întoarcă null dacă indexul de pagină
respectiv nu existăo metoda call() generează un obiect de tip Node
int totalNumberOfPages = ...;int currentPageNumber = 0;Pagination pagination = new Pagination
(totalNumberOfPage, currentPageNumber);Pagination.setPageFactory((Integer currentPage) -> {
// ...}
);
clase CSS – Pagination.STYLE_CLASS_BULLETo -fx-max-page-indicator-count
o -fx-arrows-visible
o -fx-tooltip-visible
o -fx-page-information-visible
o -fx-page-information-alignment
Clasa FileChooser permite navigarea prin sistemul de fișiere, având un look-and-feel corespunzător sistemului de operare pe care este apelat
setInitialDirectory() – directorul pe care îl deschideo poate primi ca parametru rezultatul metodei showDialog() din clasa DirectoryChooser
o se poate folosi directorul specific utilizatorului autentificat în cadrul sistemului de operare System.getProperty(“user.home”);
FileChooser fileChooser = new FileChooser();fileChooser.setTitle("Open File");// ...File file = fileChooser.showOpenDialog(stage);FileChooser fileChooser = new FileChooser();fileChooser.setTitle("Open Files");// ...List<File> fileList = fileChooser.showOpenMultipleDialog(stage);
Clasa FileChooser(cont’d) deschiderea unuia sau mai multor fișiere – metode blocante!!!o showOpenDialog() – selecția unui singur fișier
o showOpenMultipleDialog() – selecția mai multor fișiere
o java.awt.Desktop -> open() – vizualizarea conținutului folosind aplicația asociată implicito isDesktopSupported() – verificarea faptului că metodele sunt suportate pe platforma respectivă
o alte meode: browse(), edit(), mail(), print()
salvarea unui conținut pe disco showSaveDialog()
specificarea de filtre ExtensionFilter pentru specificarea tipurilor de fișiere vizibile în listă
FileChooser fileChooser = new FileChooser();fileChooser.setTile("File Chooser");fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));FileChooser.ExtensionFilter allFiles =
new FileChooser.ExtensionFilter("All Files", "*.*");FileChooser.ExtensionFilter documents =
new FileChooser.ExtensionFilter("Documents", "*.docx", "*.pdf");FileChooser.ExtensionFilter images =
new FileChooser.ExtensionFilter("Images", "*.jpg", "*.png");fileChooser.getExtensionFilters().addAll(allFiles, documents, images);
Controale definite de utilizator extinse din clasa javafx.scene.control.Control
redefinirea unor metode ale controalelor predefinite pentru a corespunde cerințelor funcționale
unele controale permit construirea conținutului pe baza unor “fabrici” de celuleo ComboBox, ListView, TableView, TreeView
o setCellFactory() – primește un obiect Callback, al cărei metodă call()furnizează conținutul dorit
Compatibilitatea JavaFXcu dispozitivele mobile implementarea unor operații specificeo atingere (doar pentru ecran tactil) – o apăsare la un moment dato gesturi (doar glisare) – ecran tactil, trackpad
tastatură virtualăo introducerea de text în anumite câmpurio vkType: numeric, url, email, text (implicit)
comportament modificat al unor controaleo ScrollBar, ScrollPane – elementele derulante nu sunt vizibile implicit și au doar rol decorativo TextField, PasswordField, TextArea, DatePicker – se vizualizează cursorulo ContextMenu – meniul contextual este dispus orizontal
limitări ale dispozitivelor mobileo TableView - redimensionarea / rearanjarea coloanelor; ordonarea dateloro ListView, TreeView – selecția multiplă;o PasswordField – suport pentru copierea textuluio nu sunt implementate HTMLEditor
redarea de conținut multimedia
Gestiunea meniurilor în JavaFX listă de elemente acționabile făcute vizibile la solicitarea utilizatoruluio un singur element din cadrul unui meniu este vizibil la un moment dat
o optimizează spațiu în interfața cu utilizatorul, funcționalitățile nu sunt vizbile tot timpul
MenuBar – meniul principal al unei aplicații
Menu – folosit pentru submeniuri◦ MenuItem – se poate asocia o combinatie de taste
◦ setAccelerator
◦ KeyCombination.keyComnination
◦ poate fi dezactivata – setDisabled(true)
◦ CheckMenuItem, RadioMenuItem, CustomMenuItem (SeparatorMenuItem)
ContextMenu – meniu contextual, folosit când lipsa de spațiu este pregnantă, afișat la apelarea metodei show()
Gestiunea meniurilor în JavaFX (cont’d) listă de elemente acționabile făcute vizibile la solicitarea utilizatoruluio un singur element din cadrul unui meniu este vizibil la un moment dat
o optimizează spațiu în interfața cu utilizatorul, funcționalitățile nu sunt vizbile tot timpul
MenuBar – meniul principal al unei aplicații, ocupă partea superioară a scenei, redimensionat la spațiul disponibilo constructor fără parametru
o asocierea categoriilor se face prin add() / addAll() apelate pe lista observabilă de meniuri (getMenus())
Menu – folosit pentru submeniuri◦ MenuItem – nu extind clasa Node, nu pot fi incluse direct în scena aplicației poate avea asociat un text și o pictogramă
acțiunea asociată se face prin metoda setOnAction() ce primește un parametru EventHandler<ActionEvent> (metoda handle())
se poate asocia o combinație de taste
• setAccelerator()
• KeyCombination.keyCombination()
poate fi dezactivata – setDisabled()
◦ CheckMenuItem, RadioMenuItem, CustomMenuItem (SeparatorMenuItem)
ContextMenu – meniu contextual, folosit când lipsa de spațiu este pregnantă, afișat la apelarea metodei show(), la coordonatele la care a fost înregistrat click-ul pe mouse getScreenX(), getScreenY()
Gestiunea meniurilor în JavaFX (cont’d)MenuBar containerMenu = new MenuBar();Menu fileMenu = new Menu("File");Menu operationsMenu = new Menu("Operations");Menu helpMenu = new Menu("Help");containerMenu.getMenus().addAll(fileMenu, operationsMenu, helpMenu);--------------------------------------------------------------------------------Menu operationsMenu = new Menu("Operations");MenuItem databaseManagementMenu = new MenuItem("DataBase Management");databaseManagementMenu.setAccelerator(KeyCombination.keyCombination("Ctrl+D"));operationsMenu.getItems().addAll(databaseManagementMenu);
CheckMenuItemo poate avea starea selectat (✔) / deselectat (doar textul / imaginea asociate)o selectedProperty() – monitorizarea modificăriloro {get|set}Selected() – starea curentă
RadioMenuItemo asociate unui ToggleGroup (metoda setToggleGroup())o selectedToggleProperty() – monitorizarea modificăriloro {get|set}SelectedToggle() – butonul selectat la momentul de timp respectiv
Gestiunea meniurilor în JavaFX (cont’d)Exemplu
@FXML private MenuBar containerMenu;@FXML private Menu databaseManagementMenu;
// ...
@FXMLprivate void initialize() {
try {DataBaseWrapper databaseWrapper = DataBaseWrapperImplementation.getInstance();
ArrayList<String> tableNames = databaseWrapper.getTableNames();for (String tableName: tableNames) {
MenuItem menuItem = new MenuItem(Utilities.tableNameToMenuEntry(tableName));menuItem.addEventHandler(EventType.ROOT, (EventHandler<Event>)this);databaseManagementMenu.getItems().add(menuItem);
}} catch (SQLException sqlException) {
System.out.println("An exception has occured: "+sqlException.getMessage());if (Constants.DEBUG)
sqlException.printStackTrace();}// ...
}
Diagrame în JavaFX grafice – pachetul javafx.scene.chart
◦ utilizează sistemul de coordonate (derivate din XYChart, XYChart.Data) LineChart, AreaChart, BubbleChart, ScatterChart, BarChart (StackedBarChart)
valorile axelor de coordonate reprezentate de xValue / yValue + extraValue
axele pot avea tipul CategoryAxis / NumberAxis
mai multe serii de date XYChart.Series
• o serie este identificată prin nume setName()
• asocierea unei serii la diagramă se face prin add() pe rezultatul metodei XYChart.Series.getData()
metode: setLabel(), setSide(), setLowerBound() / setUpperBound(), setTickUnit(), setTickLabelGap(), setTickLabelFill(), setCategoryGap(), setTickLabelRotation(), setAnimated()
o nu utilizează sistemul de coordonate PieChart / PieChart.Data – valorile fiecărei secțiuni (asociere între o etichetă și o valoare numerică)
metode: setClockwise(), setStartAngle()
metode comune: setTitle(), stabilirea poziției, setLabelsVisible(), setLegendVisible(), setLegendSide(), setLabelLineLength()
metodele ascultător asociate fiecărui nod în parte chart.getData()
Diagrame în JavaFX(cont’d)
asocierea unei foi de stil / clase CSS (.default-colorx, x valoare numerică)o chart-area-symbol
o chart-series-area-line
o chart-series-area-fill
o chart-symbol
definirea propriului tip de diagramă care extinde clasa ChartCategoryAxis xAxis = new CategoryAxis();NumberAxis yAxis = new NumberAxis();yAxis.setTickLabelFormatter(
new NumberAxis.DefaultFormatter(yAxis, "RON ", null)
);LineChart<String, Number> lineChart =
new LineChar<String, Number>(xAxis, yAxis);lineChart.setTitle("Profit Statistics");XYChart.Series series2014 = new XYChart.Series();series2014.setName("Year 2014");series2014.getData().add(new XYChart.Data("January", ...));// ...lineChart.getData.add(series2014);
Elemente de tip textîn JavaFX instanță a clasei javafx.scene.text.Texto derivată din clasa Node – suportă efecte, transformări, animații
o Node extinde Shape – se poate specifica o culoare pentru fundalul textului
metodeo constructor – textul de afișat, poziția la care se afișează
o setText(), setColor()
o setFont() Font.font(), Font.getDefault()
Font.loadFont() – seturi de caractere definite de utilizator (.ttf / .otf)
proprietăți de tip bold / italic – FontWeight.BOLD, FontPosture.ITALIC
Elemente de tip textîn JavaFX (cont’d)Text text = new Text();
text.setText("Sample Text");
text.setFont(
Font.getDefault(),
FontWeight.BOLD|FontPosture.ITALIC,
24
);
text.setFontSmoothingType(FontSmoothingType.LCD);
text.setFill(Color.BEIGE);
TextFlow – gruparea mai multor obiecte de tip Text, ignorând coordonatele elementelor, poziționându-le în funcție de proprietățile sale (lățime, înălțime, aliniere)
stilizarea: încărcarea foilor de stil cu metoda setId()
Elemente de tip textîn JavaFX (cont’d) efecte – sunt aplicate prin metoda setEffect()
◦ PerspectiveTransform – 4 puncte (x, y) ale formei ce definește transformarea de perspectivă
◦ GaussianBlur
◦ DropShadow / InnerShadow – setOffsetX() / setOffsetY(), setColor(), setRadius(), setSpread()
◦ Reflection – setTopOpacity(), setBottomOpacity(), setFraction(), setTopOffset()
◦ combinarea efectelor se face in obiecte de tip Blend (BlendMode.MULTIPLY)◦ setTopInput()
◦ setBottomInput()
Text text = new Text();Blend blend1 = new Blend(), blend2 = new Blend();blend1.setMode(BlendMode.MULTIPLY); blend2.setMode(BlendMode.MULTIPLY);DropShadow dropShadow = new DropShadow(); //...blend1.setBottomInput(dropShadow);InnerShadow innerShadow = new InnerShadow(); // ...Reflection reflection = new Reflection (); // ...blend2.setBottomInput(innerShadow);blend2.setTopInput(reflection);blend1.setTopInput(blend2);text.setEffect(blend1);
Conținut pentru pagini Internet navigator încorporat – javafx.scene.web
◦ bazat pe WebKit, motor open-source ce implementează foi de stil, JavaScript, DOM, HTML5 (Canvas, SVG, redarea de conținut media, formulare și procesare date, istoric de navigare, etichete interactive, rularea de scripturi Web, sockeți web, seturi de caractere încărcate cu @font-face, la nevoie)
funcționalitateo redarea de conținut HTML5 local sau la distanță
o istoric de vizitare
o comenzi JavaScript si executie comenzi JavaFX din acest context
o gestiunea ferestrelor
o efecte
WebEngine – funcționalitate de navigare de bază, implementează interacțiunea cu utilizatorulo încărcarea de conținut Internet, accesarea proprietăților DOM, execuția JavaScript
o conținutul unei pagini Internet se încarcă prin metoda load()
WebView – încorporează conținut HTML în scena aplicațieio extinde clasa Node
o încapsulează un obiect WebEngine – {get|set}Engine()
Conținut pentru pagini Internet(cont’d) încărcarea unei paginiString URL = "http://aipi2014.andreirosucojocaru.ro";WebView webView = new WebView();WebEngine webEngine = webView.getEngine();webEngine.load(URL);
gestiunea ferestrelor proeminente – metodă pentru tratarea evenimentului care întoarce același motor web sau unul diferito clasa PopupFeatures conţine proprietăţile unei ferestre proeminente
webEngine.setCreatePopupHandler(new Callbak<PopupFeatures, WebEngine>() {@Overridepublic WebEngine call(PopupFeatures configuration){
// ...}
});
informaţiile cu privire la navigare sunt stocate în memorieo persistenţa trebuie implementată explicit prin java.net.ResponseCache
istoricul navigăriloro getHistory().getEntries() – informații despre pagină (titlu, URL), data accesării
o go() apelată pe o intrare are un efect similar cu load()
Conținut pentru pagini Internet(cont’d) execuția de cod JavaScript în JavaFX prin executeScript()
o rezultatul execuției este un obiect java.lang.Object Int32 -> java.lang.Integer
valori numerice -> java.lang.Double
valori șir de caractere -> java.lang.String
valori adevărat/fals -> java.lang.Boolean
publicarea unui obiect JavaFX cu atributele și metodele publice vizibile în JavaScript prin JSObject.setMember()o apelată într-o metodă de tratare asociată evenimentului de încărcare a paginii
o atributele și metodele publice definite în JavaFX vor fi accesibile din JavaScriptwebEngine.getLoadWorker().stateProperty().addListener(
(ObservableValue<? extends State> observableValue, State oldState, State newState) -> {
if (newState == State.SUCCEEDED) {
JSObject jsObject = (JSObject)webEngine.executeScript("window");
jsObject.setMember("myObject", new MyClass());
}
}
);
// JavaScript interface object
public class MyClass {public void myMethod() {
// ...
}} -----------------------------------------------------------
<a href="about:blank" onclick="myObject.myMethod()">...</a>
Conținut pentru pagini Internet(cont’d) meniuri contextuale activate implicit – setContextMenuEnabled()
WebEngine.print() – tipărirea conținutului unei pagini Interneto PrinterJob.createPrinterJob() – întoarce null dacă nu există nici
o imprinantă configurată pe platforma respectivă
o endJob() – asigură că procesul de tipărire a fost încheiat
o parametri: collation, copies, pageLayout, pageRanges, paperSource, printColor, printResolution, printQuality, printSlides
TabPane – mecanism de includere a mai multor navigatoare
Mecanisme de dispunere a conținutului containere – gestiunea interfeței cu utilizatorulo componentele interfeței grafice își modifică în mod automat coordonatele și
dimensiunea în cazul modificării dimensiunii ferestrei
tipuri disponibileo BorderPane – 5 regiuni pentru poziționarea nodurilor: sus, jos, stânga, dreapta,
centru sus – meniu, jos – bară de stare, stânga – panou de navigare, dreapta – informațiii suplimentare, centru –
conținutul propriu-zis
spațiu prea mic – regiuni suprapuse, spațiu prea mare – alocat zonei centrale
metode: setTop(), setBottom(), setLeft(), setRight(), setCenter()
o HBox / VBox mecanism de dispunere a nodurilor într-un singur rând / coloană
metode:
setPadding() –> Insets: distanțele față de cele patru laturi ale containerului
setSpacing() – distanțele dintre elementele componente
setMargin() –> Insets: spațiu suplimentar în jurul unui control grafic
add() / addAll() – asocierea unor controale grafice (lista observabilă a componentelor getChildren())
Mecanisme de dispunere a conținutului(cont’d) tipuri disponibileo StackPane – nodurile dispuse într-o stivă (nodurile vechi dispuse peste
nodurile vechi) suprapunerea unui text peste o imagine / suprapunerea mai multor forme pentru obținerea unor
forme complexe
metode: setPos() – modul de poziționare a componentelor în cadrul containerului, setMargin() – plasarea fiecărui element grafi în parte
o GridPane – dispunere sub formă tabelară, un nod putând ocupa mai spațiul aferent mai multor celule util în cazul formularelor
proprietăți: gridLinesVisible – delimitează liniile și coloanele
metode
o setHgap() / setVgap() – valori întregi indicând distanțele propriu-zise
o setPadding() – distanța față de marginile containerului
o add() / addAll() – asocierea unui control grafic la obiectul GridPane (coloana, linia, numărul coloanelor, numărul liniilor pe care le ocupă)
o RowConstraints / ColumnConstraints – setHalignment() / setValignment(), HPos / VPos
Mecanisme de dispunere a conținutului(cont’d) tipuri disponibileo FlowPane – dispunere continuă, în funcție de orientare (verticală – în coloane,
orizontală – în rânduri) și de limitele mecanismului de dispunere (înălțime, lățime)
o TilePane – matrice în care fiecare element are aceeași dimensiune, dispunere orizontală (pe rânduri) / verticală (pe coloane), limitându-se la lățimea / înălțimea disponibile metode: setPrefRows(), setPrefColumns() – specifică dimensiunile unei coloane
o AnchorPane – raportarea poziției unui nod la marginile de sus, jos, stânga, dreapta, centru poziția unui nod poate fi specificată în funcție de mai multe elemente de referință
un element de referință poate servi drept repet pentru mai multe noduri
metode: setTopAnchor(), setBottomAnchor(), setLeftAnchor(), setRightAnchor(), setCenterAnchor()
Mecanisme de dispunere a conținutului(cont’d) dimensiunile unui control grafic – determinate în general de conținut, pentru a fi vizibil în totalitate și de constrângerile containeruluiometode dimensiuni minime: setMinWidth() / setMinHeight() / setMinSize()
dimensiuni maxime: setMaxWidth() / setMaxHeight() / setMaxSize()
dimensiuni preferate: setPrefWidth() / setPrefHeight()
o dimensiuni constante: Control.USE_PREF_SIZE (dimensiuni minime / maxime), specificarea unor dimensiuni preferate
o redimensionarea la spațiul disponibil: Double.MAX_VALUE (dimensiuni minime / maxime)
o alinierea: setAlignment() VPos – aliniere verticală
HPos – aliniere orizontală
Pos – aliniere verticală și orizontală (VALIGN_HALIGN; Pos.CENTER)
Foi de stil aspectul elementelor de interfață cu utilizatorul
specificația 2.1 W3C CSS + actualizări din versiunea 3
modena.css – foaia de stil folosită implicit
asocierea unui stilo setStyle() – listă de tipul atribut:valoare separate prin ; atribut – denumirea elementului de stil (prefixat cu -fx-)
valoare – caracteristica asociată, având o semantică asociată
o scene.getStyleSheets().add(“custom_style.css”) customControl.getStyleClass().add(“custom-control”) definiția unui stil – denumire sa, prefixată de . (selector / clasă de stil), serie de reguli incluse între {}
.custom-control {
-fx-font: 12px "Arial";
-fx-padding: 5;
-fx-background-color: beige;
}
o rezoluția = 96 dpi, 1 px = 0,75pto stil pentru un anumit control – identificatorul controlului, prefixat de #o stil pentru fiecare stare a unui control – denumirea controlului, :, denumirea stării
Gestiunea evenimentelor mecanisme de a transmite aplicației acțiunile realizate de utilizator
o javafx.event.Event – sau subclasele acesteia
tip eveniment – instanță a clasei EventType, organizate ierarhic (Event.ROOT / Event.ANY); subtipul ANY al fiecărui nivel desemnează orice eveniment
sursa eveniment – nodul care are asociat mecanismul de tratare al evenimentului, este modificată de-a lungul lanțului de propagare
tinta eveniment – instanta a clasei EventTarget (sau a oricarei subclase) pe lantul de transmitere construit de metoda buildEventDispatchChain()o clasele Window, Scene, Node implementează EventTarget, nu este necesar să stabilească lanțul de transmitere
Gestiunea evenimentelor(cont’d) lanț de propagare a unui evenimento selecția tintei
o selecția parcursului urmat de eveniment
o capturarea propriu-zisă
o întoarcerea la nodul sursă
selecția tinteio tastatură – nodul ce deține controlul
omouse – nodul de la locația cursorului / punctul de atingere
o gesturi – nodul din centrul acțiunilor utilizatorului, la începutul gestului
o glisare – nodul din centrul acțiunilor utilizatorului, considerându-se întregul parcurs; trackpad – nodul de la locația cursorului
o atingere pe dispozitive cu ecran tactil – nodul aflat la locația primei apăsări; metodele grab(node) / ungrab() pot fi precizate într-un anumit punct dintr-un filtru de evenimente / mecanism de tratare a evenimentelor
Gestiunea evenimentelor(cont’d) stabilirea parcursului urmat de evenimento construit de metoda buildEventDispatchChain()
o contine în mod obligatoriu obiectele Stage și Scene a nodului respectiv
o ruta poate fi modificată după cum filtrele / metodele de tratare a evenimentelor apelează metodele consume() / grab()
capturarea propriu-zisă (event capturing phase)o nod rădăcină → nod țintă
o se pot defini filtre ce pot consuma evenimentul
întoarcerea la nodul sursă (event bubbling phase)o nod tinta → nod radacina
o se pot defini metode de tratare ce pot consuma evenimentul
Gestiunea evenimentelor(cont’d) filtre și metode de tratare – implementări ale EventHandler
filtru – executat în etapa de capturare propriu-zisăo un părinte poate implementa filtre pentru mai mulți fii
o un nod poate avea asociate mai multe filtre, executate în ordinea dată de ierarhia tipului de evenimente (cele specifice înaintea celor generice)
metodă de tratare – executată în etapa de întoarcere la nodul rădăcinăo un fiu poate implementa o metodă de tratare pentru mai mulți părinți
o evenimentele specificate prin metodele de oportunitate se execută ultimele
metoda consume() anunță faptul că procesarea pentru evenimentul respectiv s-a încheiat
Gestiunea evenimentelor(cont’d) mecanism de oportunitate (eng. convenience method)
◦ asociază metode de tratare
◦ sunt definite în clasa Node, fiind disponibile pentru toate subclasele lor
◦ sintaxa
setOnEventType(EventHandler<? super event-class> value)
◦ event-type – tipul evenimentului gestionat
◦ event-class – clasa care definește tipul de eveniment (acceptă o metodă de tratare fie pentru clasa care definește tipul de eveniment, fie pentru una din superclasele acesteia)
◦ exempletableContent.setOnMouseClick(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
// …
}
});
tableContent.setOnMouseClick(null);
Gestiunea evenimentelor(cont’d)
ACŢIUNEA UTILIZATORULUI TIP DE EVENIMENT CLASASe apasă o tastă de pe tastatură. KeyEvent Node, Scene
Mouse-ul este mişcat sau se apasă un buton de pe mouse. MouseEvent Node, Scene
Se produce o secvenţă de acţiuni care implică apăsarea unui buton de pe mouse, mişcarea mouse-ului urmată de
eliberarea butonului.
MouseDragEvent Node, Scene
Se transmite conţinut printr-o metodă alternativă de introducere a caracterelor (limbă ce utilizează alte tipuri de caractere) InputMethodEvent Node, Scene
Un obiect este mutat între locaţii prin selectarea, transportarea şi deselectarea sa. DragEvent Node, Scene
Obiectul este derulat. ScrollEvent Node, Scene
Se produce un gest de tip rotaţie asupra obiectului. RotateEvent Node, Scene
Se produce un eveniment de tip derulare asupra unui obiect. SwipeEvent Node, Scene
Pe ecranul tactil, este atinsă locaţia la care se află un obiect. TouchEvent Node, Scene
Se produce un gest ce implică modificarea rezoluţiei asupra obiectului respectiv. ZoomEvent Node, Scene
Este solicitată vizualizarea meniului contextual. ContextMenuEvent Node, Scene
Butonul este apăsat.
Lista derulantă este vizibilă sau este ascunsă.
Elementul unui meniu este selectat.
ActionEvent ButtonBase,
ComboBoxBase,
ContextMenu,
MenuItem,
TextField
Se editează elementele dintr-un obiect de tip listă, tabel sau arbore. ListView.EditEvent
TableColumn.CellEditEvent
TreeView.EditEvent
ListView
TableColumn
TreeView
Obiectul de redare a conţinutului multimedia întâlneşte o eroare. MediaErrorEvent MediaView
Meniul este vizibil sau ascuns. Event Menu
O fereastră pop-up este ascunsă. Event PopupWindow
Panoul este închis sau selectat. Event Tab
Fereastra e închisă, vizibilă, ascunsă WindowEvent Window
Gestiunea evenimentelor(cont’d)node.addEventFilter(MouseEvent.MOUSE_CLICKED,
new EventHandler<MouseEvent>() {
public void handle(MouseEvent) { ... };
});
EventHandler filter = new EventHandler(<InputEvent>() {
public void handle(InputEvent event) {
// ...
event.consume();
}
node1.addEventFilter(MouseEvent.MOUSE_PRESSED, filter);
node2.addEventFilter(MouseEvent.MOUSE_PRESSED, filter);
node.addEventFilter(KeyEvent.KEY_PRESSED, filter);
node.removeEventFilter(KeyEvent.KEY_PRESSED, filter);
Gestiunea evenimentelor(cont’d)node.addEventHandler(DragEvent.DRAG_ENTERED,
new EventHandler<DragEvent>() {
public void handle(DragEvent) { ... };
});
EventHandler handler = new EventHandler<InputEvent>() {
public void handle(InputEvent event) {
// ...
event.consume();
}
node1.addEventHandler(DragEvent.DRAG_EXITED, handler);
node2.addEventHandler(DragEvent.DRAG_EXITED, handler);
node.addEventHandler(MouseEvent.MOUSE_DRAGGED, handler);
node.removeEventHandler(DragEvent.DRAG_EXITED, handler);
Gestiunea evenimentelor(cont’d)
GEST DESCRIERE EVENIMENTE GENERATE
RotaţieMişcarea unui deget în jurul altuia în sensul acelor de
ceasornic sau în sens contrar acelor de ceasornic.
ROTATION_STARTED
ROTATE
ROTATION_FINISHED
DerulareMişcare de derulare, pe verticală (sus/jos) sau pe
orizontală (stânga/dreapta).
SCROLL_STARTED
SCROLL
SCROLL_FINISHED
Dacă se foloseşte rotiţa de mouse
se generează doar evenimentul
SCROLL.
Parcurgere
Mişcare de parcurgere de-a lungul ecranului la stânga,
dreapta, în sus sau în jos. Mişcarea pe diagonală nu este
recunoscută ca parcurgere.
SWIPE_LEFT, SWIPE_RIGHT
SWIPE_UP, SWIPE_DOWN
Pentru fiecare gest se generează un
singur eveniment de parcurgere.
Mărire/MicşoareDepărtarea a două degete pentru mărire, respectiv
apropierea lor pentru micşorare.
ZOOM_STARTED
ZOOM
ZOOM_FINISHED
Gestiunea evenimentelor(cont’d) metode de verificare pentru ecranele tactileo isSynthesized() – evenimentele au fost generate de alte gesturi
o isDirect() – evenimentul nu a fost generat de alt gest
o isInertia() – evenimentul nu s-a generat ca urmare a inerției unui gest
tratare individuală a evenimentelor (fără gesturi) – TouchEvent
o tipuri: TOUCH_PRESSED, TOUCH_MOVED, TOUCH_STATIONARY, TOUCH_RELEASED
o punctul de contact – TouchPoint (coordonate, stare, nodul țintă)
o numărul de apăsări
o lista punctelor de contact
o identificatorul mulțimii de evenimente – fiecare set de evenimente are un identificator unic incrementat pentru fiecare mulțime asociată unei operații de apăsare
metodele grab / ungrab – elementele ce procesează evenimentul devin ținta acestuia, îl transmit altui nod sau îl detașează
Gestiunea evenimentelor(cont’d) operații de tip drag and drop (transfer între sursa și ținta gestului, aparținând aceleiași aplicații sau unor aplicații diferite, inclusiv non-JavaFX) – javafx.scene.input.DragEvent
◦ moduri de transfer (TransferMode): COPY, MOVE, LINK, ANY
◦ sursa și ținta trebuie să suporte ambele tipul operației
◦ sursa◦ DRAG_DETECTED → startDragAndDrop()
◦ DRAG_DONE – operații suplimentare pentru anumite moduri de transfer
◦ ținta◦ DRAG_OVER → acceptTransferModes() (verifică tipul de date pe care îl conține
obiectul transferat)
◦ DRAG_ENTERED, DRAG_EXITED → getDragboard() – conținutul, getGestureSource() –nodul sursă
◦ DRAG_DROPPED → setDropCompleted() – marcarea terminării transferului
Conținut MultimediaEfecte Vizuale pachetul javafx.scene.effect, derivate din clasa Effect
Blend – combinarea mai multor surseo modalități predefinite (BlendMode): SRC_ATOP, MULTIPLY, SRC_OVER
o setBlendMode() intrarea de nivel superior (nodul care este redat)
intrarea de nivel inferior (elementele care sunt sub acesta)
• se includ toate elementele inferioare (ordinea Z)
• procesul este terminat dacă grupul are definită o modalitate de combinare
• dacă grupul are modalitatea de combinare implicită, elementele aflate sub grup sunt incluse recursiv, folosind aceleași reguli
• dacă s-a ajuns la nodul rădăcină, se include fundalul scenei
Bloom – efect de strălucire asupra porțiunilor de imagine deschiseo setTreshold() – definește un prag (cuprins între 0.0 și 1.0)
Conținut MultimediaEfecte Vizuale (cont’d) Blur – efect de estompareo BoxBlur – nucleu de filtrare de tip cutie
• setWidth(), setHeight() – valori de configurare ale ambelor dimensiuni (independente) pentru controlul cantității de estompare
• setIterations() – calitatea estompării obținute
o MotionBlur – efect de estompare de tip Gauss setRadius(), setAngle()
o GaussianBlur – algoritm Gauss setRadius() - posibilitatea de configurare a razei
DropShadow – umbră a conținutului pe care este aplicato setColor() – culoarea mai deschisă cu câteva nuanțe decât culoarea de fundal
o setRadius() – aceeași orientare la toate obiectele din cadrul scenei pentru a da senzația unei surse de lumină dintr-o unică direcție
o setOffsetX(), setOffsetY()
InnerShadow – umbră înăuntrul marginilor conținutului pe care este aplicato setColor(), setRadius(), setOffsetX(), setOffsetY()
Reflection – copie reflectată a conținutului pe care este aplicat, plasată sub acestao setTopOpacity(), setBottomOpacity(), setFraction(), setTopOffset()
Conținut MultimediaEfecte Vizuale (cont’d) Lightning – simulează o sursă de lumină care acționează asupra conținutului
pe care este aplicato setLight() – sursa de lumină Light.Distant – sursă de lumină distantă
Light.Point – sursă de lumină poziționată la coordonatele (x, y, z)
Light.Spot – sursă de lumină poziționată la coordonatele (x, y, z) cu o direcție și un focus
o setSurfaceScale() – suprafața de scalare
o setDiffuseConstant() – constanta de difuzie
o setSpecularConstant(), setSpecularExponent() – constanta și exponentul de reflexie
Perspective – transformă un obiect bidimensional în spațiul tridimensional, realizând o transformare între două dreptunghiurio coordonatele (x, y) pentru cele patru colțuri setLlx(), setLly() – stânga jos
setLrx(), setLry() – dreapta jos
setUlx(), setUly() – stânga sus
setUrx(), setUry() – dreapta sus
o nu sunt actualizate coordonatele corespunzătoare evenimentelor asociate!!!
Înlănțuirea Efectelor – inputProperty / setInput(): alt efect aplicat înaintea realizării efectului pentru care se apelează
Conținut MultimediaTransformări 2D / 3D pachetul javafx.scene.transform
derivate din clasa Transform (subclasa Affine)o bazate pe algebra euclidiană
o asociere liniară între două sisteme de coordonate – conservă ortogonalitatea și paralelismul liniilor
redarea obiectelor 3D – tehnica Z-bufferingo un obiect solid aflat în prim-plan blochează elementele din spatele său
o setDepthTest() – DepthTest: ENABLE / DISABLE
realizate de-a lungul celor trei axe de coordonate (x, y, z) -> transformări 3D (+ camera de perspectivă)
aplicate unui singur nod / unui grup de noduri
pot fi realizate independent sau împreună
Conținut MultimediaTransformări 2D / 3D (cont’d) Translate – mută un nod dintr-o locație în alta, de-a lungul axelor, relativ la poziția sao setX(), setY(), setZ()
o pe controlul grafic: setTranslateX(), setTranslateY(), setTranslateZ()
Rotate – mută un nod în jurul unui punct considerat pivot al sceneio setAxis() – axa din sistemul de coordonate în jurul căreia se va realiza rotația
(Rotate.X_AXIS, Rotate.Y_AXIS, Rotate.Z_AXIS)
o setAngle() – unghiul cu care se realizează rotația
o setPivotX(), setPivotY(), setPivotZ() – coordonatele punctului pivot
Scale – face ca un nod să apară mai mic sau mai mare (funcție de factorul de scalare, cu care se multiplică coordonatele axelor de coordonate)o setX(), setY(), setZ() – factorii de multiplicare de-a lungul celor trei axe de coordonate
Shear – rotește o axă astfel încât axele Ox și Oy să nu mai fie perpendiculareo setX(), setY() – factorii de multiplicare cu care sunt deplasate coordonatele în sensul pozitiv
al axelor
Combinarea Transformărilor – lanț de transformări: add() / addAll() apelată pentru lista observabilă de transformări asociată nodului curent (getTransforms())
Conținut MultimediaAnimații animații– javafx.animation.Animationo Transition - tranziții: animații având asociată intern o anumită cronologie FadeTransition – schimbă opacitatea de-a lungul unei secvențe de timp
• constructor: durata, nodul asupra căruia se aplică
• setFromValue(), setToValue(), setAutoReverse(), setCycleCount(), play()
PathTransition – mută un nod de-a lungul unei căi intr-o perioadă de timp
• setPath() – obiecte CubicCurveTo: curbă Bezier între elementul curent și un punct (x,y) trecând prin alte 2 puncte de control (controlX1, controlY1), (controlX2, controlY2)
• orientarea – PathTransition.OrientationType
FillTransition, StrokeTransition – schimbă culoarea suprafeței de cumplere / conturului unui nod; valorile limită trebuie să aibă semnificația unor culori
PauseTransition – perioadă de așteptare între tranziții (apelată pe Animation.onFinished())
RotateTransition, ScaleTransition, TranslateTransition – rotirea / scalarea / translatarea unui nod cu un anumit unghi / cu anumite valori pe axele Ox, Oy, Oz / între (x1, y1, z1) → (x2, y2, z2)
ParallelTransition – tranzitiile sunt executate simultan, transformările sunt adăugate cu getChildren().addAll()
SequentialTransition – tranzițiile sunt executate secvențial, în ordinea în care au fost adăugate
Conținut MultimediaAnimații (cont’d)o Timeline - animații bazate pe timp: nodul este definit de anumite
proprietăți ce pot fi modificate automat între valori extreme (cadre cheie) funcționalități: oprire (cu sau fără reluare din punctul respectiv), redare în sens invers, repetare
KeyFrame: durata animației, metoda de tratare a evenimentului de terminare a aplicației, obiecte KeyValue
KeyValue: atributul de modificat în intervalul respectiv, valoarea cu care se modifică
o Interpolare (clasa Interpolator) – poziții intermediare ale obiectului pentru care se realizează animația, specificat pentru un obiect KeyValueo predefinită (LINEAR (implicit), DISCRETE, EASE_BOTH, EASE_IN, EASE_OUT)
o definite de utilizator – implementare a metodei curve(), folosită pentru determinarea fracției din metoda interpolate()
Conținut MultimediaRedarea conținutului audio/video pachetul javafx.scene.media
formate suportate – decodificarea unor tipuri de compresii audio-video se bazează pe motoarele multimedia ale sistemelor de operareo audio: MP3, AIFF, WAV, MPEG-4/AACo video: FLV, MPEG-4 (H.264/AVC)
funcționalitățio redarea conținutului multimedia în formatele suportate play, pause, stop, volume, mute, balance, equalizer
redarea de conținut din Internet – parametrii de redare (rata de biți / rezoluția) ajustați în funcție de condițiile respective
o suport pentru protocoalele HTTP / FILEo descărcarea conținutului în mod progresiv (folosirea unei zone de memorie tampon –
eng. buffer)o căutareo comutarea între fluxuri alternative (listă de redare, listă de segmente în care fluxul
este corupt)
Conținut MultimediaRedareaconținutului audio/video (cont’d) Media – resursă multimedia + metadata
MediaPlayer – redarea conținutuluio AUTO_PLAY, play()o VOLUME (0.0 – 1.0) – nivelul de redareo BALANCE (-1.0 – 0 – 1.0) – echilibru stânga-dreaptao pause(), stop()o getStatus() – starea obiectului MediaPlayer Status: UNKNOWN, HALTED, PLAYING, PAUSED, READY, STOPPED
o seek() – redarea conținutului se face de la momentul indicat ca parametruo getStartMediaTime() – momentul de început al conținutului multimediao setCycleCount() – numărul de redărio evenimente: terminare conținut, stagnare datorită fluxului prea lent, excepții MediaErrorEvent
o mecanisme de oportunitate: setOnPlaying(), setOnPaused(), setOnReady(), setOnEndOfMedia()
Conținut MultimediaRedareaconținutului audio/video (cont’d) MediaView – obiect Node ce încorporează MediaPlayer, suportând animații și efecteo mediaPlayer – obiectul MediaPlayer care redă conținutul
o onError() – metoda de tratare asociată unei excepții
o preserveRatio() – păstrarea raportului lățime/înălțime
o smooth() – algoritm de filtrare performant pentru scalare, conținutul multimedia este scalat la dimensiunile MediaView (fitHeight / fitWidth)
o viewport – cadrul de vizualizare al conținutului multimedia
o x, y – originea obiectului
o trebuie să i se atribuie controale grafice pentru a avea funcționalitatea oricărui produs ce redă conținut multimedia cronometru
bară de progres
butoane pentru redare conținut / oprire cu posibilitatea (sau nu) a reluării de la punctul respectiv, reglarea volumului
Conținut MultimediaRedareaconținutului audio/video (cont’d)
Scene scene = new Scene(new Group(), 500, 500);
String source = getParameters().getRaw().get(0);
Media media = new Media(source);
// Media media = new Media(MEDIA_URL);
MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.setAudio(true);
MediaView mediaView = new MediaView(mediaPlayer);
((Group)scene.getRoot()).getChildren().add(mediaView);
Dezvoltarea interfeței graficeîn mod vizualFXML limbaj bazat pe XML ce oferă structura necesară pentru dezvoltarea unei interfețe complexe cu utilizatorul,
separând-o de logica aplicației
nu respectă în mod necesar o schemăo clasele JavaFX ↔ elemente
o proprietăți JavaBeans ↔ atribute
arhitectura MVC: obiecte domeniu Java – model, FXML – vizualizare, clase Java (ce implementează Initializable) – control
util pentru grafuri de scene foarte complexe, de dimensiuni mari, formulare, tabele, animații complicate = !!! interfețe staticeo interfețe dinamice - scripturi
beneficiio sintaxă similară XML
o nu este necesara compilarea aplicației
o graful de scene este mai transparent facilitând construirea și întreținerea lui
o localizare
o compatibilitate cu orice limbaj JVM: Java, Scala, Clojure
o se pot construi servicii, sarcini sau obiecte domeniu
o Integrare cu limbaje de tipul JavaScript
o se pot construi interfețe grafice complexe fără cunoștințe ale unui limbaj de programare de nivel înalt (Java)
Dezvoltarea interfeței graficeîn mod vizualFXML (cont’d) caracteristici JavaFX 2.2o prefixarea caracterelor speciale cu \
o variabilă implicită pentru controller, documentează spațiul de nume, legătură cu interfața grafică
o constructor pentru FXMLLoader, alternativă la metoda statică load()
o particularizarea instanțierii clasei controller, prin specificarea unei fabrici în obiectul FXMLLoader către care se deleagă construirea clasei
o foi de stil ușor de utilizat
o definirea metodelor de tratare a evenimentelor în clasa controller, fără parametri
o eticheta <fx:constant> facilitaeaza procesul de cautare al constantelor java.lang.Double.NEGATIVE_INFINITY ↔ <Double fx:constant=“NEGATIVE_INFINITY” />
o acces îmbunătățit la subclasele care asigură controlul unor noduri definite ca elemente ale scenei din FXML – se construiesc subclasele care asigură controlul în cadrul metodei initialize())
o initializarea claselor care asigură controlul se face prin mecanismul de reflectare (apelează automat metoda initialize() – publică sau adnotată cu @FXML)
o ușurința în realizarea de noi controale prin metodele setRoot() și setController()prin care codul sursă ce le apelează poate stabili valori, astfel că aceste operații nu mai trebuie realizate de FXMLLoader
Dezvoltarea interfeței graficeîn mod vizualFXML (cont’d)
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<AnchorPane fx:id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="128.0" prefWidth="336.0000999999975" style="-fx-background-color: beige;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ro.pub.cs.aipi.lab03.controller.Authentication">
<children>
<GridPane layoutX="15.0" layoutY="8.0" prefWidth="309.0">
<children>
<Label text="User name:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
<Label text="Password:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
<TextField fx:id="usernameTextField" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="0" />
<PasswordField fx:id="passwordTextField" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<HBox prefHeight="100.0" prefWidth="200.0" spacing="5.0" GridPane.columnIndex="1" GridPane.columnSpan="2147483647" GridPane.rowIndex="2">
Dezvoltarea interfeței graficeîn mod vizualFXML (cont’d)
<children>
<Button mnemonicParsing="false" onAction="#okButtonHandler" text="OK" />
<Button mnemonicParsing="false" onAction="#cancelButtonHandler" text="Cancel" />
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0" GridPane.columnIndex="0" GridPane.columnSpan="2147483647" GridPane.rowIndex="3">
<children>
<Label fx:id="errorLabel" textFill="RED" />
</children>
</HBox>
</children>
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="155.0" minWidth="10.0" prefWidth="114.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="206.0" minWidth="10.0" prefWidth="195.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" valignment="CENTER" vgrow="SOMETIMES" />
<RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
</children>
</AnchorPane>
Dezvoltarea interfeței graficeîn mod vizualFXML (cont’d)
elementul rădăcină specifică proprietatea fx:controller (clasa care se va ocupa de gestiunea interfeței grafice reprezentată de fișierul .fxml) controalele injectate în codul sursă au specificat un identificator fx:ido trebuie adnotate cu @FXML
o pot fi utilizate după încărcarea scenei și apelul metodei initialize()
metodele de tratare a avenimentelor trebuie precizate explicito prefixate de #
o clasa controller trebuie să le implementeze în mod obligatoriu (adnotate cu @FXML)
Dezvoltarea interfeței graficeîn mod vizualFXML (cont’d) încărcarea unei scene din cadrul unui fișier FXML
try {applicationScene = new
Scene((Parent)FXMLLoader.load(getClass().getResource(Constants.AUTHENTICATION_FXML)));} catch (Exception exception) {
System.out.println ("An exception has occured: "+exception.getMessage());if (Constants.DEBUG)
exception.printStackTrace();}
metodele pentru tratarea evenimentelor și atributele private trebuie adnotate cu @FXML
@FXML private TextField usernameTextField;@FXML private PasswordField passwordTextField;@FXML private Label errorLabel; @FXML protected void okButtonHandler(ActionEvent event) {
// ...}
@FXML protected void cancelButtonHandler(ActionEvent event) {
// ...}
Dezvoltarea interfeței graficeîn mod vizualScene Builder 2.0 versiuni disponibile pe Windows (.msi), MacOS X (.dmg), Linux (.deb și tar.gz) –32/64 biți
caracteristicio interfață WYSIWYG de tip drag and drop – dezvoltarea rapidă a unui UI fără a scrie cod sursăo integrare facilă cu orice IDE pentru Javao generare automată a codului FXML, separat de logica aplicației și foi de stilo editare în timp real și funcționalități de previzualizare, modificările sunt vizibile pe măsură ce
sunt implementate, fără a rula aplicațiao acces la intreaga bibliotecă de controale JavaFX 8o Specificare a unor elemente de interfață grafică definite de utilizator (.jar, .fxml, importate
în panourile ierarhie / conținut)o suport 3D – proprietăți din panoul de inspectare (fără Material / Mesh); obiectele nu pot fi
create, doar vizualizateo suport pentru text particularizat – TextFlow ce poate conține mai multe obiecte Text,
gestionate autonomo JavaFX Scene Builder Kit – API pentru integrarea funcționalităților în interfața grafică a unor
IDE-uri ca NetBeans, Eclipse, IntelliJo suport pentru CSSo disponibilitate pe mai multe sisteme de operare, consistențăo gratuitate pentru toate tipurile de utilizatori
Dezvoltarea interfeței graficeîn mod vizualScene Builder 2.0 (cont’d)
Library: bibliotecă de componente cu care se poate construi interfața cu utilizatorulo moduri de dispunere, controale propriu-zise
o categorii: Containers, Controls, Menu, Miscellaneous, Shapes, Charts, 3D
Documento Hierarchy: ierarhia de noduri – obiectele ce conțin alte noduri au asociate semne de + sau - după cum sunt sau
nu expandate
o Controller – clasa controller asociată fișierului .fxml și componentele care au identificator unic pe baza căruia vor fi injectate în codul sursă
previzualizarea interfetei cu utilizatorulo se construiește interfața cu utilizatorul prin operații de tip drag & drop
o partea superioară: scena de grafuri pentru nodul curent
o la adăugarea unui control, obiectul părinte este evidențiat în mod deosebit
Inspector: căutarea în biblioteca de controale / interfața grafică (pentru UI complexe)
Properties: stabilirea proprietăților obiectului selectat în mod current (efecte, transformări, asocierea unor foi de stil, aliniere, vizibilitate, opacitate, orientare)
Layout: aspecte legate de modul de dispunere al nodului (dimensiuni, aliniere, poziție, transformări, limite)
❼ Code: metodele executate din clasa controller atunci când o acțiune se produce asupra interfeței respective(main, drag & drop, evenimente legate de tastatură și mouse, specifice dispozitivelor mobile)
Modele de date asociatecontroalelor JavaFX model JavaBeans pentru reprezentarea obiectelor - suport pentru o proprietățiclass MyClass {
private SomeTypeProperty myAttribute = new SomeTypeProperty();
// ...
}
setter și getter: setMyAttribute() / getMyAttribute(); myAttributeProperty()
o dependențe (modificările vizible asupra obiectului cu care se găsește în legătură) – informații din interfața grafică sincronizate cu sursa de date clase specifice tipului de date - DataTypeBinding (DataType = tipul de date respectiv)
clasa Bindings
interfețe pentru notificare la modificarea / invalidarea unei valorio Observable (nu conține și valoarea) -> InvalidationListener (evaluare leneșă / rapidă)o ObservableValue (încapsulează valoarea) -> ChangeListener (evaluare rapidă)
evaluare leneșă – valoarea este calculată doar când este solicitatăMyClass myObject = new MyClass();myObject.myAttributeProperty().addListener(new ChangeListener() {
@Overridepublic void changed(Observable Value observableValue, Object oldValue, Object newValue) {
// ...}
});
Modele de date asociatecontroalelor JavaFX (cont’d) colecții de date: javafx.collections
interfețeo ObservableList – listă ce permite ascultătorilor să identifice modificările atunci când
se produc (< javafx.beans.Observable + java.util.List), FXCollections.observableList(), addListener()
o ListChangeListener – interfață ce primește modificările realizate asupra unui ObservableList
o ObservableMap – asocieri cheie unică – valoare ce permite ascultătorilor să identifice modificările atunci când se produc (< javafx.beans.Observable + java.util.Map), FXCollections.observableMap(), addListener()
o MapChangeListener interfață ce primește modificările realizate asupra unui ObservableMap
claseo FXCollections – clasă de utilitare cu aceeași funcționalitate ca java.util.Collections
o ListChangeListener.Change – schimbare asupra unui obiect ObservableList, poate reține informații despre mai multe modificări (iterator next())
o MapChangeListener.Change – schimbare asupra unui obiect ObservableMap, poate reține informații despre o singură modificare corespunzătoare operației put() sau remove()
Modele de date asociatecontroalelor JavaFX (cont’d)
List<String> list = new ArrayList<String>();
ObservableList<String> observableList = FXCollections.observableList(list);
observableList.addListener(new ListChangeListener() {
@Override
public void onChanged(ListChangeListener.Change change) {
while (change.next()) {
if (change.wasAdded()) {
}
if (change.wasRemoved()) {
}
if (change.wasReplaced()) {
}
if (change.wasPermutated()) {
}
}
}
});
-----------------------------------------------------------------------------
Map<String,String> map = new HashMap<String,String>();
ObservableMap<String,String> observableMap = FXCollections.observableMap(map);
observableMap.addListener(new MapChangeListener() {
@Override
public void onChanged(MapChangeListener.Change change) {
}
});
Gestiunea concurențeiîn JavaFX pachetul javafx.concurrent – dezvoltarea de aplicații ce rulează pe mai multe fire de execuțieo completează setul de metode din java.util.concurrent
o viteză răspuns satisfăcătoare prin execuția sarcinilor ce consumă resurse pe fire de execuție rulate în fundal (operații ce durează mult timp pe firul de execuție al aplicației JavaFX scade responsivitatea interfeței cu utilizatorul)
interfața Workero obiect ce realizează anumite sarcini pe unul / mai multe fire de execuție
o starea sa este observabilă din firul de execuție al aplicației JavaFX READY – imediat după ce a fost creat
SCHEDULED – programat pentru o anumită sarcină
RUNNING – după ce a fost pornit (dacă este pornit direct, trece oricum prin SCHEDULED)
SUCCEEDED – sarcina este executată cu succes (proprietatea value este transmisă)
FAILED – sarcina nu a putut fi finalizată (proprietatea exception este transmisă)
CANCELED – sarcina este întreruptă de utilizator prin apelul metodei cancel()
Gestiunea concurențeiîn JavaFX (cont’d) clasele ce implementează interfața Workero funcționalități pentru un fir de execuție ce comunică cu interfața grafică
o Implementează EventTarget – ascultarea evenimentelor legate de starea firelor de execuție
o Task (< java.util.concurrent.FutureTask) – definirea de sarcini asincrone logica sarcinii care trebuie executată în fundal – metoda call(): realizează operațiile și furnizează
rezultatul
updateProgress(), updateMessage(), updateTitle() – doar proprietăți publice din cadrul firului de execuție JavaFX
transmis unui fir de execuție / folosit din interfața de programare Executor / apelat prin FutureTask.run() din contextul unui fir de execuție ce rulează în fundal
trebuie să verifice dacă nu a fost înterupt isCanceled() (generază InterruptedExceptiondacă cancel() este apelat în timpul unor metode blocante)
proprietățile totalWork, workDone, progress / progressProperty – vizualizarea progresului unui obiect de tip Task
Gestiunea concurențeiîn JavaFX (cont’d) clasele ce implementează interfața Workero Service – execuția sarcinilor asincrone execută un obiect de tip Task pe unul sau mai multe fire de execuție care rulează în fundal
asigură interacțiunea dintre firele de execuție care rulează în fundal și firul de execuție al aplicației JavaFX
operații: pornire, repornire, oprire
pe parcursul rulării sale furnizează starea proceselor din fundal
rulare: Executor / fir de execuție de tip daemon / ThreadPoolExecutor
WorkerStateEvent – modificarea stării unui obiect Workero ANY, WORKER_STATE_CANCELLED, WORKER_STATE_FAILED, WORKER_STATE_READY, WORKER_STATE_RUNNING, WORKER_STATE_SCHEDULED, WORKER_STATE_SUCCEEDED
o cancelled(), failed(), ready(), running(), scheduled(), succeeded() –metode pentru tratarea tranzițiilor dintre stări
Recomandări referitoare la implementarea aplicațiilor JavaFX nivelul de logică a aplicațieio procese de lungă durată → ecrane animate care indică progresulo denumiri simbolice pentru pachete – mentenanță mai facilăo implementarea arhitecturii MVC prin intermediul fișierelor FXML pentru definirea sceneloro rularea sarcinilor ce implică volum mare de date pe fire de execuție ce rulează în fundal
nivelul de prezentareo organizarea interfeței grafice prin panouri de dispunereo aceleași dimensiuni pentru controale similare (încadrarea în panouri VBox / indicarea
dimensiunilor maxime și dispunerea într-un TilePane)o mentinerea nodurilor la dimensiunile preferate (Control.USE_PREF_SIZE) pentru
prevenirea comportamentelor nedorite la redimensionareo prevenirea operației de redimensionare prin indicarea dimensiunilor minime, maxime,
preferate la aceeași valoareo alinierea nodurilor si panourilor prin metoda setAlignment() ce primește constante din
pachetul javafx.geometry (HPos / VPos / Pos)o folosirea foilor de stil