Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator03 [2014/10/27 12:33]
Andrei Roșu-Cojocaru [Activitate de Laborator]
laboratoare:laborator03 [2014/11/17 20:48] (current)
Andrei Roșu-Cojocaru [Soluții]
Line 4: Line 4:
 ===== Obiective ==== ===== Obiective ====
  
 +  * familiarizarea cu facilitățile oferite de tehnologia JavaFX pentru dezvoltarea de interfețe cu utilizatorul în comparație cu alte soluții existente;
 +  * identificarea principalelor componente din cadrul arhitecturii JavaFX;
 +  * descrierea structurii generale a unei aplicații JavaFX și a firelor de execuție din contextul cărora pot fi accesate obiectele corespunzătoare controalelor grafice, respectiv interacțiunii cu utilizatorul;​
 +  * implementarea unei interfețe cu utilizatorul folosind Scene Builder 2.0 / FXML cu injectarea controalelor grafice / metodelor de tratare a evenimentelor în clasa controller din codul sursă;
 +  * înțelegerea mecanismului de tratare a evenimentelor legate de interacțiunea cu utilizatorul în JavaFX; dezvoltarea de filtre și metode de tratare pentru diferite acțiuni ale utilizatorului;​
 +  * însușirea practicilor utilizate pentru dezvoltarea aplicațiilor JavaFX.
 ===== Cuvinte Cheie ==== ===== Cuvinte Cheie ====
  
Line 10: Line 16:
 ===== Materiale Ajutătoare ====== ===== Materiale Ajutătoare ======
  
 +{{ :​laboratoare:​laborator03:​aipi2014-lab03-slides.pdf }}
 +
 +{{ :​laboratoare:​laborator03:​aipi2014-lab03-slides-3pp.pdf }}
 ===== JavaFX - aspecte generale ===== ===== JavaFX - aspecte generale =====
  
Line 20: Line 29:
   * **limbajul de adnotare FXML şi utilitarul SceneBuilder**. FXML este un limbaj declarativ de adnotare bazat pe XML prin intermediul căruia pot fi dezvoltate interfeţe grafice cu utilizatorul,​ fără a fi necesar ca aplicaţia să fie recompilată de fiecare dată când sunt modificate elemente din cadrul acesteia. În acest mod se realizează o separare între nivelul de prezentare și nivelul de logică a aplicației. SceneBuilder permite construirea interfeţei în mod vizual, generând automat şi documentul FXML asociat, acesta putând fi integrat apoi în orice mediu de dezvoltare. Astfel, nu mai este necesară decât implementarea mecanismelor de tratare a evenimentelor corespunzătoare diferitelor controale (elemente din cadrul interfeței grafice);   * **limbajul de adnotare FXML şi utilitarul SceneBuilder**. FXML este un limbaj declarativ de adnotare bazat pe XML prin intermediul căruia pot fi dezvoltate interfeţe grafice cu utilizatorul,​ fără a fi necesar ca aplicaţia să fie recompilată de fiecare dată când sunt modificate elemente din cadrul acesteia. În acest mod se realizează o separare între nivelul de prezentare și nivelul de logică a aplicației. SceneBuilder permite construirea interfeţei în mod vizual, generând automat şi documentul FXML asociat, acesta putând fi integrat apoi în orice mediu de dezvoltare. Astfel, nu mai este necesară decât implementarea mecanismelor de tratare a evenimentelor corespunzătoare diferitelor controale (elemente din cadrul interfeței grafice);
   * **componente WebView**. Un modul ce foloseşte tehnologia WebKitHTML permite integrarea de pagini Internet în cadrul unei interfeţe grafice. De asemenea, codul JavaScript ce rulează în WebView poate accesa orice API-uri Java, la fel cum API-urile Java pot executa cod JavaScript care rulează în WebView. Există suport și pentru anumite funcționalități HTML5 (Web Sockets, Web Workers, Web Fonts) sau capabilități de tipărire;   * **componente WebView**. Un modul ce foloseşte tehnologia WebKitHTML permite integrarea de pagini Internet în cadrul unei interfeţe grafice. De asemenea, codul JavaScript ce rulează în WebView poate accesa orice API-uri Java, la fel cum API-urile Java pot executa cod JavaScript care rulează în WebView. Există suport și pentru anumite funcționalități HTML5 (Web Sockets, Web Workers, Web Fonts) sau capabilități de tipărire;
-  * **interoperabilitate cu tehnologia Swing**. Aplicaţiile Swing existente pot fi extinde ​cu funcţionalităţi JavaFX, ca redarea de conţinuturi grafice sau a unor pagini Internet integrate. Clasa ''​SwingNode''​ permite integrarea unui conținut dezvoltat folosind tehnologia Swing în cadrul aplicației JavaFX;+  * **interoperabilitate cu tehnologia Swing**. Aplicaţiile Swing existente pot fi extinse ​cu funcţionalităţi JavaFX, ca redarea de conţinuturi grafice sau a unor pagini Internet integrate. Clasa ''​SwingNode''​ permite integrarea unui conținut dezvoltat folosind tehnologia Swing în cadrul aplicației JavaFX;
   * **biblioteci de controale şi foi de stil**. JavaFX pune la dispoziţia programatorilor majoritatea controalelor necesare pentru dezvoltarea unei interfeţe cu utilizatorul complete (inclusiv ''​DatePicker''​ și ''​TreeTableView''​),​ aspectul acestora putând fi particularizat folosind tehnologii web standard ca foile de stil (//eng.// CSS – cascading style sheets), prin intermediul claselor ''​Styleable*'';​   * **biblioteci de controale şi foi de stil**. JavaFX pune la dispoziţia programatorilor majoritatea controalelor necesare pentru dezvoltarea unei interfeţe cu utilizatorul complete (inclusiv ''​DatePicker''​ și ''​TreeTableView''​),​ aspectul acestora putând fi particularizat folosind tehnologii web standard ca foile de stil (//eng.// CSS – cascading style sheets), prin intermediul claselor ''​Styleable*'';​
   * **tema Modena** este folosită ca implicită pentru toate aplicațiile JavaFX (înlocuind tema Caspian, care poate fi utilizată prin apelul metodei ''​setUserAgentStylesheet(STYLESHEET_CASPIAN)''​ în metoda ''​start()''​ a clasei derivate din ''​Application'';​   * **tema Modena** este folosită ca implicită pentru toate aplicațiile JavaFX (înlocuind tema Caspian, care poate fi utilizată prin apelul metodei ''​setUserAgentStylesheet(STYLESHEET_CASPIAN)''​ în metoda ''​start()''​ a clasei derivate din ''​Application'';​
Line 283: Line 292:
 {{ :​laboratoare:​laborator03:​figura04.png?​nolink&​700 }} {{ :​laboratoare:​laborator03:​figura04.png?​nolink&​700 }}
  
-Pe lângă controalele clasice (existente în AWT şi Swing) au fost dezvoltate şi alte componente, precum ''​Accordion'',​ ''​ColorPicker'',​ ''​Chart''​ , ''​DatePicker'',​ ''​Pagination'',​ ''​TitledPane'',​ ''​TreeTableView''​. ​+Pe lângă controalele clasice (existente în AWT şi Swing) au fost dezvoltate şi alte componente, precum ''​Accordion'',​ ''​ColorPicker'',​ ''​Chart'',​ ''​DatePicker'',​ ''​Pagination'',​ ''​TitledPane'',​ ''​TreeTableView''​. ​
  
-Fiind derivate din clasa ''​Node'',​ controalele pentru interfaţa cu utilizatorul pot fi integrate în diferite animaţii, efecte , transformări sau tranziţii în cadrul procesului de randare a scenei.+Fiind derivate din clasa ''​Node'',​ controalele pentru interfaţa cu utilizatorul pot fi integrate în diferite animaţii, efecte, transformări sau tranziţii în cadrul procesului de randare a scenei.
  
 === Label === === Label ===
Line 383: Line 392:
 Dimensiunea câmpului text este precizată prin metoda ''​setPrefColumnCount()''​. ​ Dimensiunea câmpului text este precizată prin metoda ''​setPrefColumnCount()''​. ​
  
-Unui astfel de element i se poate asocia un text descriptiv indicând semnificaţia conţinutului,​ prin metoda ''​setPromptText()''​. Ştergerea textului conţinut de aceste obiecte se face apelând metoda ''​clear()''​. O astfel de funcționalitate este utilă atunci când nu se utilizează etichete împreună cu câmpurile text pentru a specifica conținutul acestora. Totuși, doar valoarea specificată de utilizator poate fi obținută prin metoda ''​getText()''​ asociată acestui tip de control.+Unui astfel de element i se poate asocia un text descriptiv indicând semnificaţia conţinutului,​ prin metoda ''​setPromptText()''​. O astfel de funcționalitate este utilă atunci când nu se utilizează etichete împreună cu câmpurile text pentru a specifica conținutul acestora. Totuși, doar valoarea specificată de utilizator poate fi obținută prin metoda ''​getText()''​ asociată acestui tip de control. 
 + 
 +Ştergerea textului conţinut de aceste obiecte se face apelând metoda ''​clear()''​.
  
 Metodele puse la dispoziţie de aceste clase sunt: Metodele puse la dispoziţie de aceste clase sunt:
Line 912: Line 923:
 | ''​Button'',​\\ ''​Hyperlink'',​\\ ''​MenuButton'',​\\ ''​ToggleButton''​ | atingere | activează butonul | | ''​Button'',​\\ ''​Hyperlink'',​\\ ''​MenuButton'',​\\ ''​ToggleButton''​ | atingere | activează butonul |
 | ''​CheckBox''​ | atingere (//eng.// tap) | comută între stările selectat / deselectat | | ''​CheckBox''​ | atingere (//eng.// tap) | comută între stările selectat / deselectat |
-| ''​ComboBox''​ | atingere ​pictogramă ​pictogramă | afișează sau ascunde lista activă; elementul afișat în câmpul text este selectat când lista activă este vizibilă |+| ''​ComboBox''​ | atingere pictogramă | afișează sau ascunde lista activă; elementul afișat în câmpul text este selectat când lista activă este vizibilă |
 | ::: | atingere câmp text | ♦ controale non-editabile:​ afișează lista activă | | ::: | atingere câmp text | ♦ controale non-editabile:​ afișează lista activă |
 | ::: | ::: | ♦ controale editabile: plasează cursorul în câmpul text | | ::: | ::: | ♦ controale editabile: plasează cursorul în câmpul text |
Line 1213: Line 1224:
 </​code>​ </​code>​
  
-Modul în care sunt gestionate ferestrele proeminente poate fi specificat prin intermediul unei metode de tratare care poate întoarce acelaşi motor web ca cel curent (caz în care pagina respectivă este deschisă în acelaşi navigator) sau alt motor web. Clasa ''​PopupFeatures''​ descrie proprietățile unei ferestre proeminente (așa cum sunt descrise de specificația JavaScript),​ instanța sa fiind transmis metodei de tratare a evenimentului de încărcare a unui conținut de acest tip.+Modul în care sunt gestionate ferestrele proeminente poate fi specificat prin intermediul unei metode de tratare care poate întoarce acelaşi motor web ca cel curent (caz în care pagina respectivă este deschisă în acelaşi navigator) sau alt motor web. Clasa ''​PopupFeatures''​ descrie proprietățile unei ferestre proeminente (așa cum sunt descrise de specificația JavaScript),​ instanța sa fiind transmisă metodei de tratare a evenimentului de încărcare a unui conținut de acest tip.
  
 <code java> <code java>
Line 1224: Line 1235:
 </​code>​ </​code>​
  
-Componenta ''​WebView''​ reține informațiile cu privire la navigare în memorie, astfel încât acestea sunt pierdute atunci când aplicația este terminată. Persistența poate fi însă implementată în mod explicit prin clasa ''​java.bet.ResponseCache''​.+Componenta ''​WebView''​ reține informațiile cu privire la navigare în memorie, astfel încât acestea sunt pierdute atunci când aplicația este terminată. Persistența poate fi însă implementată în mod explicit prin clasa ''​java.net.ResponseCache''​.
  
 Clasa ''​WebEngine''​ pune la dispoziţie metoda ''​executeScript()''​ pentru a rula o comandă JavaScript declarată în cadrul documentului încărcat în navigator la momentul de timp respectiv. Rezultatul execuției metodei este convertit la un obiect ''​java.lang.Object'',​ pe baza următoarelor reguli: Clasa ''​WebEngine''​ pune la dispoziţie metoda ''​executeScript()''​ pentru a rula o comandă JavaScript declarată în cadrul documentului încărcat în navigator la momentul de timp respectiv. Rezultatul execuției metodei este convertit la un obiect ''​java.lang.Object'',​ pe baza următoarelor reguli:
Line 1261: Line 1272:
 Pentru obiectele ''​WebView'',​ meniurile contextuale sunt activate implicit, dezactivarea lor realizându-se prin metoda ''​setContextMenuEnabled()''​. Pentru obiectele ''​WebView'',​ meniurile contextuale sunt activate implicit, dezactivarea lor realizându-se prin metoda ''​setContextMenuEnabled()''​.
  
-Istoricul paginilor vizitate poate fi obţinut prin metoda ''​getHistory()''​ aplicată obiectului de tip ''​WebEngine'',​ întorcând un obiect de tip ''​WebHistory''​. Acesta este o listă de intrări ce poate fi accesată prin metoda ''​getEnteries()'',​ conţinând informaţii despre pagină (URL şi titlu) sau despre data la care aceasta a fost vizitată cel mai recent. Metoda ''​go()''​ a acestei clase forțează navigatorul să încarce pagina reţinută la indexul respectiv.+Istoricul paginilor vizitate poate fi obţinut prin metoda ''​getHistory()''​ aplicată obiectului de tip ''​WebEngine'',​ întorcând un obiect de tip ''​WebHistory''​. Acesta este o listă de intrări ce poate fi accesată prin metoda ''​getEntries()'',​ conţinând informaţii despre pagină (URL şi titlu) sau despre data la care aceasta a fost vizitată cel mai recent. Metoda ''​go()''​ a acestei clase forțează navigatorul să încarce pagina reţinută la indexul respectiv.
  
 Conținutul unei pagini Internet poate fi tipărit folosint imprimanta instalată în cadrul mașinii, folosind metoda ''​print()''​ din clasa ''​WebEngine''​. Aceasta primește un obiect de tip ''​PrinterJob'',​ obținut prin apelul metodei statice ''​PrinterJob.createPrinterJob()''​. În situația în care nu există nici o imprimantă instalată, rezultatul întors va fi ''​null''​. De asemenea, trebuie apelată metoda ''​endJob()''​ a obiectului ''​PrinterJob''​ pentru a se asigura faptul că procesul de tipărire a fost terminat. Conținutul unei pagini Internet poate fi tipărit folosint imprimanta instalată în cadrul mașinii, folosind metoda ''​print()''​ din clasa ''​WebEngine''​. Aceasta primește un obiect de tip ''​PrinterJob'',​ obținut prin apelul metodei statice ''​PrinterJob.createPrinterJob()''​. În situația în care nu există nici o imprimantă instalată, rezultatul întors va fi ''​null''​. De asemenea, trebuie apelată metoda ''​endJob()''​ a obiectului ''​PrinterJob''​ pentru a se asigura faptul că procesul de tipărire a fost terminat.
Line 1277: Line 1288:
 === BorderPane === === BorderPane ===
  
-Un container de tip ''​BorderPane''​ oferă cinci regiuni pentru poziționarea nodurilor: sus, jos, stânga, dreapta ​li centru, acestea putând avea orice dimensiune.+Un container de tip ''​BorderPane''​ oferă cinci regiuni pentru poziționarea nodurilor: sus, jos, stânga, dreapta ​şi centru, acestea putând avea orice dimensiune.
  
 <note tip>În situația în care aplicația JavaFX nu are nevoie de o anumită regiune, aceasta nu va fi definită, nefiind alocat spațiu pentru ea.</​note>​ <note tip>În situația în care aplicația JavaFX nu are nevoie de o anumită regiune, aceasta nu va fi definită, nefiind alocat spațiu pentru ea.</​note>​
Line 2134: Line 2145:
   * ''​READY''​ (imediat după ce a fost creat);   * ''​READY''​ (imediat după ce a fost creat);
   * ''​SCHEDULED''​ (atunci când este programat pentru o anumită sarcină)   * ''​SCHEDULED''​ (atunci când este programat pentru o anumită sarcină)
-  * ''​RUNNING''​ (după ce a fost pornit) - în cazul în care firul de execuţie este pornit în mod direct, el va trece mai înainte prin starea ''​SCHEDULED''​ înainte de RUNNING, chiar dacă nu a fost programat propriu-zis;​+  * ''​RUNNING''​ (după ce a fost pornit) - în cazul în care firul de execuţie este pornit în mod direct, el va trece mai înainte prin starea ''​SCHEDULED''​ înainte de ''​RUNNING''​, chiar dacă nu a fost programat propriu-zis;​
   * ''​SUCCEEDED''​ (dacă sarcina este executată cu succes, proprietatea ''​value''​ fiind transmisă rezultatului acestui obiect);   * ''​SUCCEEDED''​ (dacă sarcina este executată cu succes, proprietatea ''​value''​ fiind transmisă rezultatului acestui obiect);
   * ''​FAILED''​ (dacă sarcina nu a putut fi finalizată,​ proprietatea ''​exception''​ fiind transmisă excepţiei care s-a produs)   * ''​FAILED''​ (dacă sarcina nu a putut fi finalizată,​ proprietatea ''​exception''​ fiind transmisă excepţiei care s-a produs)
Line 2162: Line 2173:
  
 Recomandările referitoare la implementarea aplicaţiilor JavaFX vizează atât nivelul de logică a aplicaţiei,​ cât şi nivelul de prezentare. Recomandările referitoare la implementarea aplicaţiilor JavaFX vizează atât nivelul de logică a aplicaţiei,​ cât şi nivelul de prezentare.
-În privinţa nivelului de logică a aplicaţiei:​  + 
-  * atunci când trebuie încărcate mai multe resurse într-o scenă, operaţia implicând o perioadă de timp considerabilă,​ trebuie folosite ​ecrane ​animate ​care să indice progresul ​acestui proces ​astfel încât aplicaţia să nu pară că nu răspunde la interacţiunea cu utilizatorul;​+În privinţa nivelului de logică a aplicaţiei, cele mai frecvent uzitate tehnici sunt:  
 +  * folosirea ​ecrane ​animatelor ​care să indice progresul ​acelor procese de lungă durată ​astfel încât aplicaţia să nu pară că nu răspunde la interacţiunea cu utilizatorul;​
   * folosirea unor denumiri simbolice pentru pachetele implementate pentru ca aplicaţia să fie mai organizată şi mai uşor de întreţinut;​   * folosirea unor denumiri simbolice pentru pachetele implementate pentru ca aplicaţia să fie mai organizată şi mai uşor de întreţinut;​
   * implementarea arhitecturii model-view-controller (MVC) prin intermediul fişierelor FXML pentru definirea scenelor, acestea reprezentând partea de vizualizare,​ în timp ce modelul este reprezentat de obiectele de domeniu specifice aplicaţiei,​ iar partea de control aparţine codului Java care defineşte comportamentul interfeţei grafice în interacţiunea cu utilizatorul;​   * implementarea arhitecturii model-view-controller (MVC) prin intermediul fişierelor FXML pentru definirea scenelor, acestea reprezentând partea de vizualizare,​ în timp ce modelul este reprezentat de obiectele de domeniu specifice aplicaţiei,​ iar partea de control aparţine codului Java care defineşte comportamentul interfeţei grafice în interacţiunea cu utilizatorul;​
   * rularea sarcinilor care implică procesarea unui volum mare de date pe fire de execuţie separate, care rulează în fundal, pentru a evita ca utilizatorul să aştepte foarte mult până la terminarea metodei.   * rularea sarcinilor care implică procesarea unui volum mare de date pe fire de execuţie separate, care rulează în fundal, pentru a evita ca utilizatorul să aştepte foarte mult până la terminarea metodei.
  
-Referitor la nivelul de prezentare:+Referitor la nivelul de prezentare, se recomandă următoarele practici:
   * utilizarea panourilor de dispunere, astfel încât conţinutul să fie organizat şi să poată fi utilizat cu uşurinţă;​   * utilizarea panourilor de dispunere, astfel încât conţinutul să fie organizat şi să poată fi utilizat cu uşurinţă;​
   * asigurarea faptului că toate butoanele au aceeaşi dimensiune se poate realiza mai uşor prin încadrarea tuturor într-un panou de dispunere de tip ''​VBox''​ sau prin indicarea valorilor maxime pentru dimensiunile lor şi dispunerea într-un obiect de tip ''​TilePane'';​   * asigurarea faptului că toate butoanele au aceeaşi dimensiune se poate realiza mai uşor prin încadrarea tuturor într-un panou de dispunere de tip ''​VBox''​ sau prin indicarea valorilor maxime pentru dimensiunile lor şi dispunerea într-un obiect de tip ''​TilePane'';​
   * menţinerea nodurilor la dimensiunile preferate (''​Control.USE_PREF_SIZE''​) astfel încât în cazul unor operaţii de redimensionare să nu se producă comportamente nedorite;   * menţinerea nodurilor la dimensiunile preferate (''​Control.USE_PREF_SIZE''​) astfel încât în cazul unor operaţii de redimensionare să nu se producă comportamente nedorite;
   * prevenirea operaţiei de redimensionare prin specificarea dimensiunilor minime, maxime şi preferate la aceeaşi valoare;   * prevenirea operaţiei de redimensionare prin specificarea dimensiunilor minime, maxime şi preferate la aceeaşi valoare;
-  * alinierea nodurilor şi panourilor folosind metoda ''​setAlignment''​ care primeşte ca parametru constante din pachetul ''​javafx.geometry''​ precum ''​HPos''​ pentru alinierea orizontală,​ ''​VPos''​ pentru alinierea verticală sau ''​Pos''​ pentru alinierea verticală şi orizontală;​ această constantă are forma ''​Pos.VALIGN_HALIGN''​ unde ''​VALIGN''​ poate fi ''​TOP'',​ ''​BOTTOM'',​ ''​CENTER'',​ iar ''​HALIGN''​ poate lua valorile ''​LEFT'',​ ''​RIGHT'',​ ''​CENTER''​.+  * alinierea nodurilor şi panourilor folosind metoda ''​setAlignment()''​ care primeşte ca parametru constante din pachetul ''​javafx.geometry''​ precum ''​HPos''​ pentru alinierea orizontală,​ ''​VPos''​ pentru alinierea verticală sau ''​Pos''​ pentru alinierea verticală şi orizontală;​ această constantă are forma ''​Pos.VALIGN_HALIGN''​ unde ''​VALIGN''​ poate fi ''​TOP'',​ ''​BOTTOM'',​ ''​CENTER'',​ iar ''​HALIGN''​ poate lua valorile ''​LEFT'',​ ''​RIGHT'',​ ''​CENTER''​.
   * folosirea foilor de stil pentru definirea aspectului interfeţei grafice, aceasta putând fi modificată cu uşurinţă prin schimbarea foii de stil asociate.   * folosirea foilor de stil pentru definirea aspectului interfeţei grafice, aceasta putând fi modificată cu uşurinţă prin schimbarea foii de stil asociate.
  
Line 2184: Line 2196:
 Se doreşte implementarea unei interfeţe grafice cu utilizatorul pentru gestiunea informaţiilor dintr-o bază de date, aceasta urmând a fi utilizată pentru ​ un sistem ERP destinat unei librării care comercializează doar cărţi. ​ Se doreşte implementarea unei interfeţe grafice cu utilizatorul pentru gestiunea informaţiilor dintr-o bază de date, aceasta urmând a fi utilizată pentru ​ un sistem ERP destinat unei librării care comercializează doar cărţi. ​
  
-Aplicaţia va avea iniţial ​două ferestre: +Aplicaţia va avea două ferestre: 
-  * un formular pentru autentificarea utilizatorilor în sistem+  * un formular pentru autentificarea utilizatorilor în sistem;
   * o fereastră în care sunt implementate operaţiile pentru o tabelă dintr-o bază de date (adăugare, modificare, ştergere, căutare).   * o fereastră în care sunt implementate operaţiile pentru o tabelă dintr-o bază de date (adăugare, modificare, ştergere, căutare).
  
Line 2191: Line 2203:
   - [**20 puncte**] Să se deschidă fişierul ''​authentication.fxml''​ cu SceneBuilder 2.0 sau cu orice alt editor de text – inclusiv în cadrul NetBeans / Eclipse.   - [**20 puncte**] Să se deschidă fişierul ''​authentication.fxml''​ cu SceneBuilder 2.0 sau cu orice alt editor de text – inclusiv în cadrul NetBeans / Eclipse.
     - Să se precizeze clasa controller pentru documentul FXML (având ca rădăcină un mecanism de gestiune a conținutului de tip ''​AnchorPane''​) ca fiind ''​ro.pub.cs.aipi.lab03.controller.Authentication''​.     - Să se precizeze clasa controller pentru documentul FXML (având ca rădăcină un mecanism de gestiune a conținutului de tip ''​AnchorPane''​) ca fiind ''​ro.pub.cs.aipi.lab03.controller.Authentication''​.
-    - Pentru butoanele ''​Ok''​ / ''​Cancel'',​ să se specifice metodele care vor fi executate în cazul producerii unui eveniment de tipul ''​ActionEvent.ACTION''​ (proprietatea ''​onAction''​) ca fiind: +    - Pentru butoanele ''​Ok''​ / ''​Cancel'',​ să se specifice metodele care vor fi executate în cazul producerii unui eveniment de tipul ''​ActionEvent.ACTION''​ (proprietatea ''​onAction()''​) ca fiind: 
-      * ''​okButtonHandler''​ +      * ''​okButtonHandler()''​; 
-      * ''​cancelButtonHandler''​+      * ''​cancelButtonHandler()''​;
     - Să se specifice identificatori (proprietatea ''​fx:​id''​) pentru:     - Să se specifice identificatori (proprietatea ''​fx:​id''​) pentru:
-      * cele două câmpuri text (nume utilizator / parolă), având denumirile ''​usernameTextField''​ / ''​passwordTextField'';​+      * cele două câmpuri text pentru specificarea parametrilor ​nume utilizator / parolă, având denumirile ''​usernameTextField''​ / ''​passwordTextField'';​
       * eticheta în care se va afișa un mesaj de eroare în situația în care operația de autentificare eșuează, având denumirea ''​errorLabel''​.       * eticheta în care se va afișa un mesaj de eroare în situația în care operația de autentificare eșuează, având denumirea ''​errorLabel''​.
     - În clasa controller ''​ro.pub.cs.aipi.lab03.controller.Authentication'',​ sa se implementeze metodele ''​okButtonHandler()''​ / ''​cancelButtonHandler()''​ ce gestionează accesul utilizatorului în aplicaţie. Vor avea dreptul de a accesa sistemul informatic doar utilizatorii al căror rol este administrator. În cazul în care combinaţia (utilizator,​ parolă) este incorectă sau utilizatorul nu are acces în sistem, se va afişa un mesaj corespunzător care va rămâne pe ecran maxim 5 secunde. ​     - În clasa controller ''​ro.pub.cs.aipi.lab03.controller.Authentication'',​ sa se implementeze metodele ''​okButtonHandler()''​ / ''​cancelButtonHandler()''​ ce gestionează accesul utilizatorului în aplicaţie. Vor avea dreptul de a accesa sistemul informatic doar utilizatorii al căror rol este administrator. În cazul în care combinaţia (utilizator,​ parolă) este incorectă sau utilizatorul nu are acces în sistem, se va afişa un mesaj corespunzător care va rămâne pe ecran maxim 5 secunde. ​
-  - [**20 puncte**] În clasa ''​TableManagement'',​ din pachetul ''​ro.pub.cs.aipi.lab03.controller''​ să se populeze obiectul ''​attributesGridPane''​ care va avea pe două coloane obiectele de tip ArrayList<​Label>​ (''​attributeLabels''​),​ respectiv ArrayList<​Control>​ (''​attributeControls''​).\\ Înainte de a adăuga obiectul propriu-zis,​ trebuie să îi specificaţi poziţia în cadrul obiectului de tip ''​GridPane'',​ prin intermediul metodei ''​GridPane.setConstraints(object,​ column ,​row)''​.\\ \\ În interfaţa grafică se folosesc cinci butoane (adăugare, editare, ştergere, căutare, golire conținut) pentru a se realiza operaţiile de tip CRUD. În momentul când se produce o acţiune corespunzătoare unuia dintre aceste acestea, se vor apela metodele corespunzătoare evenimentului de tip ''​onAction'',​ specificate în fișierul FXML.\\ {{ :laborator:​laborator03:​activitate_de_laborator02.png?​nolink }}+  - [**20 puncte**] În clasa ''​TableManagement'',​ din pachetul ''​ro.pub.cs.aipi.lab03.controller''​ să se populeze obiectul ''​attributesGridPane''​ care va avea pe două coloane obiectele de tip ''​ArrayList<​Label>​'' ​(''​attributeLabels''​),​ respectiv ​''​ArrayList<​Control>​'' ​(''​attributeControls''​).\\ Înainte de a adăuga obiectul propriu-zis,​ trebuie să îi specificaţi poziţia în cadrul obiectului de tip ''​GridPane'',​ prin intermediul metodei ''​GridPane.setConstraints(object,​ column ,​row)''​.\\ \\ În interfaţa grafică se folosesc cinci butoane (adăugare, editare, ştergere, căutare, golire conținut) pentru a se realiza operaţiile de tip CRUD.\\ În momentul când se produce o acţiune corespunzătoare unuia dintre aceste acestea, se vor apela metodele corespunzătoare evenimentului de tip ''​onAction()'',​ specificate în fișierul FXML.\\ {{ :laboratoare:​laborator03:​activitate_de_laborator02.png?​nolink }}\\ 
   - [**20 puncte**] În clasa ''​TableManagement'',​ din pachetul ''​ro.pub.cs.aipi.lab03.controller'',​ să se implementeze metoda ''​updateButtonHandler()''​ corespunzătoare butonului care actualizează valorile din controale (câmpuri text și liste de selecție) în tabelă.   - [**20 puncte**] În clasa ''​TableManagement'',​ din pachetul ''​ro.pub.cs.aipi.lab03.controller'',​ să se implementeze metoda ''​updateButtonHandler()''​ corespunzătoare butonului care actualizează valorile din controale (câmpuri text și liste de selecție) în tabelă.
   - [**10 puncte**] În clasa ''​TableManagement'',​ din pachetul ''​ro.pub.cs.aipi.lab03.controller'',​ să se implementeze metoda ''​clearButtonHandler()''​ care curăță conținutul câmpurilor text și al listelor de selecție, lăsând completată numai valoarea corespunzătoare cheii primare autoincrementale cu următoarea valoare din baza de date.   - [**10 puncte**] În clasa ''​TableManagement'',​ din pachetul ''​ro.pub.cs.aipi.lab03.controller'',​ să se implementeze metoda ''​clearButtonHandler()''​ care curăță conținutul câmpurilor text și al listelor de selecție, lăsând completată numai valoarea corespunzătoare cheii primare autoincrementale cu următoarea valoare din baza de date.
Line 2212: Line 2224:
 ===== Soluții ===== ===== Soluții =====
  
-disponibile pe 3 noiembrie 2014+[[https://​github.com/​aipi2014/​Laborator03/​tree/​master/​Eclipse/​|Proiect Eclipse]]\\ 
 +[[https://​github.com/​aipi2014/​Laborator03/​tree/​master/​NetBeans/​|Proiect NetBeans]]
laboratoare/laborator03.1414406009.txt.gz · Last modified: 2014/10/27 12:33 by Andrei Roșu-Cojocaru
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0