This shows you the differences between two versions of the page.
|
poo:laboratoare:10 [2025/11/30 16:45] george.tudor1906 |
poo:laboratoare:10 [2025/11/30 17:42] (current) george.tudor1906 |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Laboratorul 9 ===== | + | ===== Laboratorul 10 ===== |
| - | **Atentie!** | + | |
| - | + | ||
| - | <hidden> | + | |
| - | Acest laborator se va rezolva acasa, de catre TOATA SERIA (inclusiv grupa de luni), | + | |
| - | si se va prezenta la laboratoarele din saptamanile 5-9 dec sau 12-16 dec. | + | |
| - | </hidden> | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | Primele 2 probleme sunt rezolvate, testati-le si apoi rezolvati si celelalte probleme din laborator. | + | |
| - | + | ||
| - | Folositi pentru aceasta exemplele de rezolvari de la primele 2 probleme. | + | |
| - | {{:poo:laboratoare:laborator_swing_1_rezolvari1_2.zip| Arhiva rezolvari problema 1 si 2}} | + | |
| - | + | ||
| - | + | ||
| - | Rezolvarile vor tine cont de indicatiile de la curs 9 - vezi ultimul slide din curs - si anume, folosim direct componentele si optiunile Swing, nu doar AWT! | + | |
| + | {{:poo:laboratoare:laborator11.zip|Arhiva laborator}} | ||
| === Problema 1 === | === Problema 1 === | ||
| + | Pornind de la clasa **//Book//**, pusă la dispoziție în arhiva laboratorului, realizați o listă, obiect de tip **//JList//**, care să afișeze o serie de cărți. | ||
| - | Sa se realizeze un program care afiseaza patru campuri text si un buton. | + | În implementare, constructorul obiectului **//JList//** primește ca parametru un obiect de tip **//Vector//**, care o să conțină elemente de tip **//Book//**. |
| - | In primele trei campuri text, utilizatorul introduce numele discului suport (A:, | + | |
| - | C:, D:), calea (secventa de directoare) si numele unui fisier. La apasarea pe | + | |
| - | buton se va afisa, in cel de-al patrulea camp text, calea completa la fisier. | + | |
| - | In implementare, se vor scrie urmatoarele doua variante: | + | <note important>Lista va afisa pentru fiecare carte titlul si autorul (numele icon-ului corespunzator va fi sirul vid "")! |
| - | * Se inregistreaza trei obiecte ascultator (ActionListener) cate unul pentru fiecare JTextField, care transfera textul din fiecare camp text in cel destinat rezultatului. | + | Lista trebuie sa fie una scrolabila. |
| - | * Se inregistreaza un singur obiect ascultator la JButton, care va compune datele din primele 3 campuri si le va afisa in cel destinat rezultatului. | + | </note> |
| - | <note important>Trecerea de la un camp text la altul se va putea face si cu tasta Tab. Insa evenimentul de tip ActionEvent pentru un JTextField se genereaza la apasarea lui Enter! </note> | + | {{:poo:laboratoare:prob1.png|}} |
| + | ===Problema 2=== | ||
| - | === Problema 2 === | + | Modificați aplicația realizată la problema anterioară, folosind de această dată, în loc de un obiect de tip **//Vector//**, un obiect de tip **//DefaultListModel//**. |
| - | + | De asemenea, adaugați două câmpuri text și doua etichete pentru titlul cărții și autor. Cele patru elemente se vor plasa într-un panou separat. | |
| - | Sa se realizeze un program care citeste dintr-un fisier o intrebare urmata | + | Adaugați listei un ascultător de tip **//ListSelectionListener//**. Atunci când utilizatorul va selecta un câmp al listei, trebuie să se introducă informațiile aferente cărții selectate în cele două câmpuri text. |
| - | de 4 raspunsuri posibile, unul singur fiind corect (primul indicat in fisier), si afiseaza un camp text nemodificabil, care va contine enuntul intrebarii, patru butoane de tip **JRadioButton**, grupate intr-un grup de butoane (**ButtonGroup**),continand raspunsurile posibile, si un buton pentru validarea raspunsului selectat. | + | |
| - | Butonul de validare este de tip JButton si este accesibil doar dupa ce a | + | |
| - | fost ales un raspuns. In cazul in care raspunsul selectat este corect, se va aplica | + | |
| - | textului raspunsului culoarea verde, iar, in caz contrar, i se va aplica raspunsului | + | |
| - | corect culoarea rosie. | + | |
| + | Pentru a evita producerea unei exceptii, uzitati codul de mai jos. | ||
| <code java> | <code java> | ||
| @Override | @Override | ||
| - | public void actionPerformed ( ActionEvent e ) { | + | public void valueChanged(ListSelectionEvent e) { |
| - | if (e.getSource() instanceof JRadioButton ) { | + | //JList listBook - membrul al clasei |
| - | button.setEnabled(true); | + | if(listBook.isSelectionEmpty()) |
| - | } | + | return; |
| - | } | + | } |
| </code> | </code> | ||
| - | <note important> intrebare.txt </note> | + | <note tip>GridLayout</note> |
| - | === Problema 3 === | + | {{:poo:laboratoare:prob2.png|}} |
| - | Modificati programul implementat la exercitiul anterior, pentru afisarea unor casete cu bifare, **JCheckBox**. Astfel, de aceasta data vom avea un program care permite uzitarea unor intrebari cu raspunsuri corecte multiple. Toate cele patru casete de tip **JCheckBox** vor avea un singur ascultator de tip **ItemListener**, cu o metoda **itemStateChanged()** si cu un argument de tip **ItemEvent**. | + | ===Problema 3=== |
| + | Pentru aplicația anterioară, implementați o modalitate de ștergere a unei celule selectate; operația se va executa la apăsarea unui buton adăugat pentru aceasta. | ||
| - | Butonul de validare este de tip JButton si este accesibil doar dupa ce a fost ales un raspuns. La apasarea butonului de validare se va aplica textelor raspunsurilor corecte culoarea verde, iar celor incorecte li se va aplica culoarea rosie. Presupunem ca sunt corecte primul si al treilea raspuns. | + | {{:poo:laboratoare:prob3.png|}} |
| - | <note important> getSource() </note> | + | ===Problema 4=== |
| + | Realizați o aplicație care să permită afișarea tuturor fișierelor dintr-un director. Aceasta va conține, în partea stângă, un obiect de tip **//JTree//** ce va afișa directoarele și fișierele aflate în directorul părinte pe care dorim să îl explorăm, iar în partea dreapta un tabel, obiect de tip **//JTable//**, care va conține informații detaliate pentru fiecare fișier din directorul selectat. Mai exact, tabelul va avea următoarele câmpuri: numele, dimensiunea, data ultimei modificări și tipul. | ||
| - | === Problema 4 === | + | {{:poo:laboratoare:aplicatie2.png|}} |
| - | Sa se implementeze o aplicatie grafica cu 3 obiecte cursor, de tip **JSlider**, si un camp text. Fiecare cursor corespunde ponderii unei culori (Red, Green, Blue), iar culoarea apare in campul text. Pentru fiecare obiect JSlider, trebuie sa definiti urmatoarele: orientarea, valoarea minima, valoarea maxima si valoarea initiala afisata (ca numere intregi). | ||
| - | La deplasarea cursorului, se genereaza un eveniment de tip **ChangeEvent** si se apeleaza metoda **stateChanged**, dintr-un obiect **ChangeListener**. Valoarea ce corespunde pozitiei cursorului se poate obtine cu metoda **getValue()** din clasa **JSlider**, ce are ca rezultat un **int**. | + | ===Problema 5=== |
| - | <note important> slider = new JSlider(JSlider.HORIZONTAlL, 0, 255, 0); </note> | + | Pornind de la aplicația implementată la problema precedentă, să se adauge două JTextField-uri în care se vor completa numărul liniei şi respectiv al coloanei selectate din JTable. |
| - | === Problema 5 === | + | Pentru aceasta se vor defini două clase ascultător ANONIME compatibile cu interfața **//ListSelectionListener//**, în care se va implementa metoda **//valueChanged()//**, cu argument de tip **//ListSelectionEvent//**. |
| - | Program pentru afisarea unui buton cu inscriptia Colors si modificarea culorii acestuia ca urmare a efectuarii unui click pe buton. Metoda **setForeground()** cu parametru de tip **Color** schimba culoarea textului, iar metoda **setBackground()** schimba culoarea butonului. La fiecare click se va itera pe un vector de culori, initializat cu constante (**Color.RED**, **Color.BLUE** etc). Folositi o fereastra **JFrame** cu dimensiuni mici (100, 100) si organizarea **FlowLayout**. Implementati si posibilitatea de actionare a butonului prin combinatia de taste ALT+C. | + | Se vor adăuga cele două clase ascultător anonime la obiectele **//ListSelectionModel//** pentru modelul pe linii, respectiv pe coloane al tabelului, modele care vor fi extrase cu metoda **//getSelectionModel()//** (vezi exemplu şi curs). |
| - | <note important> buton.setMnemonic(KeyEvent.VK_C); </note> | + | Exemplu: |
| + | <code java> | ||
| + | ListSelectionModel rowSM = table.getSelectionModel(); | ||
| + | ListSelectionModel colSM = table.getColumnModel().getSelectionModel(); | ||
| + | </code> | ||
| - | === Problema 6 === | + | {{:poo:laboratoare:prob5.png?700|}} |
| + | ===Problema 6=== | ||
| - | Realizati o fereastra cu titlu, folosind **JFrame**, care sa contina urmatoarele: o eticheta, avand ca text Calea, un **JTextField**, un **JButton** si un **JScrollPane** care sa contina un **JTextArea**, setat initial ca fiind invizibil. | + | Să se adauge aplicației de la problema 2 o clasă **//BookRenderer//**, care să extindă **//JPanel//** și să implementeze **//ListCellRenderer//**. Această clasă va conține trei obiecte de tip **//JLabel//** (Titlul, Autorul si Imaginea), pentru a schimba aspectul listei inițiale. De această dată, pentru fiecare carte vom afișa titlul, autorul, dar și imaginea aferentă. Atunci când o celulă este selectată o să apară pe fundal rosu, iar când nu este selectată verde dacă este pe o poziție pară și galben dacă este pe una impară. |
| - | Dupa ce se va introduce o cale, catre un fisier text aflat local pe disc, se va afisa continutul acestui fisier in fereastra, uzitand componenta de tip **JTextArea**. | + | <code java> |
| + | icon.setIcon(new ImageIcon("Imagini/" + book.getIconName() + ".jpg")); | ||
| + | </code> | ||
| - | Componenta de tip **JScrollPane** va deveni vizibila la accesarea butonului, daca exista fisierul specificat local pe disc, in caz contrar, se va sterge continutul din **JTextField**. | + | {{:poo:laboratoare:aplicatie.png|}} |
| - | <note important> File f = new File(path); | ||
| - | |||
| - | if(f.exists() && !f.isDirectory()) { ... } | ||
| - | </note> | ||