This shows you the differences between two versions of the page.
|
poo:laboratoare:10 [2025/11/30 16:51] george.tudor1906 |
poo:laboratoare:10 [2025/11/30 17:42] (current) george.tudor1906 |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Laboratorul 12. ===== | + | ===== Laboratorul 10 ===== |
| + | |||
| + | {{:poo:laboratoare:laborator11.zip|Arhiva laborator}} | ||
| === Problema 1 === | === Problema 1 === | ||
| - | Pornind de la codul de mai jos, asigurați faptul că se va apela codul aferent tipului dinamic al parametrului, definind clasele **//Hero//**, **//Warrior//**, **//Ninja//**, **//Rogue//** și **//StormFire//**, în mod minimal! | + | 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. |
| + | |||
| + | În implementare, constructorul obiectului **//JList//** primește ca parametru un obiect de tip **//Vector//**, care o să conțină elemente de tip **//Book//**. | ||
| + | |||
| + | <note important>Lista va afisa pentru fiecare carte titlul si autorul (numele icon-ului corespunzator va fi sirul vid "")! | ||
| + | Lista trebuie sa fie una scrolabila. | ||
| + | </note> | ||
| + | |||
| + | {{:poo:laboratoare:prob1.png|}} | ||
| + | |||
| + | ===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. | ||
| + | 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. | ||
| + | Pentru a evita producerea unei exceptii, uzitati codul de mai jos. | ||
| <code java> | <code java> | ||
| - | public class Binding{ | + | @Override |
| - | public static void main(String args[]) { | + | public void valueChanged(ListSelectionEvent e) { |
| - | Hero h1 = new Warrior(), h2 = new Ninja(); | + | //JList listBook - membrul al clasei |
| - | Hero h3 = new Rogue(); | + | if(listBook.isSelectionEmpty()) |
| - | BadLuck bl = new StormFire(); | + | return; |
| - | bl.execute(h1); | + | |
| - | bl.execute(h2); | + | |
| - | bl.execute(h3); | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | abstract class BadLuck { | + | |
| - | abstract void execute(Hero h); | + | |
| - | abstract void execute(Warrior w); | + | |
| - | abstract void execute(Ninja n); | + | |
| - | abstract void execute(Rogue r); | + | |
| } | } | ||
| </code> | </code> | ||
| - | <note warning>Clasele **//Hero//** și **//BadLuck//** sunt clase abstracte!</note> | + | <note tip>GridLayout</note> |
| - | === Problema 2 === | + | {{:poo:laboratoare:prob2.png|}} |
| - | Să se definească o clasă **__generica__** **//ArrayMap//**, pentru un dicționar realizat din doi vectori (un vector de chei și un vector de valori asociate, obiecte din clasa **//Vector//**), care să poată înlocui o clasă **//HashMap//** sau **//TreeMap//**. Astfel, această clasă va extinde clasa **//AbstractMap//**, suprascriind următoarele metode: | + | |
| + | ===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. | ||
| + | |||
| + | {{:poo:laboratoare:prob3.png|}} | ||
| + | |||
| + | ===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. | ||
| + | |||
| + | {{:poo:laboratoare:aplicatie2.png|}} | ||
| + | |||
| + | |||
| + | ===Problema 5=== | ||
| + | |||
| + | 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. | ||
| + | |||
| + | 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//**. | ||
| + | |||
| + | 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). | ||
| + | |||
| + | Exemplu: | ||
| <code java> | <code java> | ||
| - | public String toString(); | + | ListSelectionModel rowSM = table.getSelectionModel(); |
| - | public V put(K, V); | + | ListSelectionModel colSM = table.getColumnModel().getSelectionModel(); |
| - | public V get(Object ); | + | |
| - | public Set<K> keySet(); | + | |
| - | public Collection<V> values(); | + | |
| - | public Set<Map.Entry<K, V>> entrySet(); // atentie! Se va defini o clasa interna pentru o intrare in dictionar - **//Map.Entry//** | + | |
| </code> | </code> | ||
| - | Afișați dicționarul folosind System.out.println(dictionar) si apoi folosind un **//Iterator//** pentru a parcurge mulțimea intrarilor generată de metoda **//entrySet//**. | ||
| - | === Problema 3 === | + | {{:poo:laboratoare:prob5.png?700|}} |
| - | Pornind de la clasa abstractă **//AMatrix//**, pusă la dispoziție în arhiva laboratorului, implementați clasa **//IntegerMatrix//** care moștenește această clasă abstractă și modelează un tablou bidimensional cu numere întregi. Clasa **//AMatrix//** moștenește clasa **//ArrayList//**. Astfel, matricea propriu-zisă este un obiect de tip **//ArrayList//** care conține elemente de tip **//ArrayList//**. Clasa va conține metode pentru următoarele operații: afișarea matricei, adunarea a două matrice, și metoda sum pentru a aduna două elemente!. | + | ===Problema 6=== |
| + | |||
| + | 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ă. | ||
| <code java> | <code java> | ||
| - | //afisare | + | icon.setIcon(new ImageIcon("Imagini/" + book.getIconName() + ".jpg")); |
| - | public String toString(); | + | |
| - | //sum | + | |
| - | public Integer sum(Integer obj1, Integer obj2) | + | |
| - | //adunare | + | |
| - | public AMatrix addition(AMatrix m); | + | |
| </code> | </code> | ||
| - | <note important>Folosiți iteratori pentru parcurgerea colecțiilor sau bucle for each! </note> | + | {{:poo:laboratoare:aplicatie.png|}} |
| - | === Problema 4 === | ||
| - | Definiți clasa **//GenericListMethods//** care să implementeze interfața, pusă la dispoziție în arhiva laboratorului, **//GenericInterface//**. Această interfață conține operații care prelucrează o listă, cu elemente de tip **//Comparable//**. Metoda **//removeDuplicates//** primește ca parametru un obiect de tip **//ArrayList//** și transformă lista într-on mulțime, eliminând duplicatele. | ||
| - | Metoda **//max//** are ca parametru tot un **//ArrayList//** și returnează elementul maximal din listă. | ||
| - | Ultima metodă conținută de interfață, **//binarySearch//**, este folosită pentru a determina poziția unei valori într-o listă ordonata, uzitând pentru aceasta algoritmul de căutare binară, detaliat în blocul de cod de mai jos. | ||
| - | <code c> | ||
| - | int BinarySearch(v, start, end, x) { | ||
| - | //conditia de oprire (x nu se afla in v) | ||
| - | if (start > end) | ||
| - | return -1; | ||
| - | //etapa divide | ||
| - | int mid = (start + end) / 2; | ||
| - | //etapa stapaneste | ||
| - | if (v[mid] == x) | ||
| - | return mid; | ||
| - | if (v[mid] > x) | ||
| - | return BinarySearch(v, start, mid-1, x); | ||
| - | if (v[mid] < x) | ||
| - | return BinarySearch(v, mid+1, end, x); | ||
| - | } | ||
| - | </code> | ||
| - | {{:poo:laboratoare:arhiva9.zip|Arhivă laborator}} | ||