This shows you the differences between two versions of the page.
|
poo:laboratoare:09 [2017/11/21 22:49] mihai.nan |
poo:laboratoare:09 [2025/11/30 17:22] (current) george.tudor1906 |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Laboratorul 09. ===== | + | ====== Laborator 9 ====== |
| + | {{:poo:laboratoare:arhiva_laborator_-_swing_1.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! | + | |
| + | Să se realizeze un program care afișează patru câmpuri text și un buton. În primele trei câmpuri text, utilizatorul introduce numele discului suport (A:, C:, D:), calea (secvența de directoare) și numele unui fișier. La apăsarea pe buton se va afișa, în cel de-al patrulea câmp text, calea completă la fișier. | ||
| + | |||
| + | În implementare, se vor scrie următoarele două variante: | ||
| + | |||
| + | * Se înregistrează trei obiecte ascultător (**ActionListener**) câte unul pentru fiecare **JTextField**, care transferă textul din fiecare câmp text în cel destinat rezultatului. | ||
| + | * Se înregistrează un singur obiect ascultător la **JButton**, care va compune datele din primele 3 câmpuri și le va afișa în cel destinat rezultatului. | ||
| + | |||
| + | <note tip> | ||
| + | Trecerea de la un câmp text la altul se va putea face și cu tasta Tab. Însă evenimentul de tip **ActionEvent** pentru un **JTextField** se generează la apăsarea lui Enter! | ||
| + | </note> | ||
| + | |||
| + | === Problema 2 === | ||
| + | |||
| + | Să se realizeze un program care citește dintr-un fișier o întrebare urmată de 4 răspunsuri posibile, unul singur fiind corect (primul indicat în fișier), și afișează un câmp text nemodificabil, care va conține enunțul întrebării, patru butoane de tip **JRadioButton**, grupate într-un grup de butoane (**ButtonGroup**), conținând răspunsurile posibile, și un buton pentru validarea răspunsului selectat. | ||
| + | |||
| + | Butonul de validare este de tip **JButton** și este accesibil doar după ce a fost ales un răspuns. În cazul în care răspunsul selectat este corect, se va aplica textului răspunsului culoarea verde, iar, în caz contrar, i se va aplica răspunsului corect culoarea roșie. | ||
| <code java> | <code java> | ||
| - | public class Binding{ | + | @Override |
| - | public static void main(String args[]) { | + | public void actionPerformed(ActionEvent e) { |
| - | Hero h1 = new Warrior(), h2 = new Ninja(); | + | if (e.getSource() instanceof JRadioButton) { |
| - | Hero h3 = new Rogue(); | + | button.setEnabled(true); |
| - | BadLuck bl = new StormFire(); | + | |
| - | bl.execute(h1); | + | |
| - | bl.execute(h2); | + | |
| - | bl.execute(h3); | + | |
| } | } | ||
| } | } | ||
| + | </code> | ||
| - | abstract class BadLuck { | + | <note important> |
| - | abstract void execute(Hero h); | + | Fișier de intrare: **intrebare.txt** |
| - | abstract void execute(Warrior w); | + | </note> |
| - | abstract void execute(Ninja n); | + | |
| - | abstract void execute(Rogue r); | + | === Problema 3 === |
| - | } | + | |
| + | Modificați programul implementat la exercițiul anterior, pentru afișarea unor casete cu bifare, **JCheckBox**. Astfel, de această dată vom avea un program care permite uzitarea unor întrebări cu răspunsuri corecte multiple. | ||
| + | |||
| + | Toate cele patru casete de tip **JCheckBox** vor avea un singur ascultător de tip **ItemListener**, cu o metodă //itemStateChanged()// și cu un argument de tip **ItemEvent**. | ||
| + | |||
| + | Butonul de validare este de tip **JButton** și este accesibil doar după ce a fost ales un răspuns. La apăsarea butonului de validare se va aplica textelor răspunsurilor corecte culoarea verde, iar celor incorecte li se va aplica culoarea roșie. | ||
| + | |||
| + | <note tip> | ||
| + | Presupunem că sunt corecte primul și al treilea răspuns. | ||
| + | |||
| + | Metodă utilă: //getSource()// | ||
| + | </note> | ||
| + | |||
| + | === Problema 4 === | ||
| + | |||
| + | Să se implementeze o aplicație grafică cu 3 obiecte cursor, de tip **JSlider**, și un câmp text. Fiecare cursor corespunde ponderii unei culori (Red, Green, Blue), iar culoarea apare în câmpul text. | ||
| + | |||
| + | Pentru fiecare obiect **JSlider**, trebuie să definiți următoarele: | ||
| + | * orientarea; | ||
| + | * valoarea minimă; | ||
| + | * valoarea maximă; | ||
| + | * valoarea inițială afișată (ca numere întregi). | ||
| + | |||
| + | <note important> | ||
| + | La deplasarea cursorului, se generează un eveniment de tip **ChangeEvent** și se apelează metoda //stateChanged//, dintr-un obiect **ChangeListener**. | ||
| + | |||
| + | Valoarea ce corespunde poziției cursorului se poate obține cu metoda //getValue()// din clasa **JSlider**, ce are ca rezultat un //int//. | ||
| + | </note> | ||
| + | |||
| + | <code java> | ||
| + | slider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0); | ||
| </code> | </code> | ||
| - | <note warning>Clasele **//Hero//** și **//BadLuck//** sunt clase abstracte!</note> | + | === Problema 5 === |
| - | === Problema 2 === | + | Program pentru afișarea unui buton cu inscripția "Colors" și modificarea culorii acestuia ca urmare a efectuării unui click pe buton. |
| - | 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 și adunarea a două matrice. | + | |
| + | Metoda //setForeground()// cu parametru de tip **Color** schimbă culoarea textului, iar metoda //setBackground()// schimbă culoarea butonului. La fiecare click se va itera pe un vector de culori, inițializat cu constante (//Color.RED//, //Color.BLUE// etc). | ||
| + | |||
| + | <note tip> | ||
| + | Folosiți o fereastră **JFrame** cu dimensiuni mici (100, 100) și organizarea **FlowLayout**. | ||
| + | |||
| + | Implementați și posibilitatea de acționare a butonului prin combinația de taste **ALT+C**. | ||
| + | </note> | ||
| <code java> | <code java> | ||
| - | //afisare | + | buton.setMnemonic(KeyEvent.VK_C); |
| - | public String toString(); | + | |
| - | //adunare | + | |
| - | public AMatrix addition(AMatrix m); | + | |
| </code> | </code> | ||
| + | |||
| + | === Problema 6 === | ||
| + | |||
| + | Realizați o fereastră cu titlu, folosind **JFrame**, care să conțină următoarele: | ||
| + | * o etichetă, având ca text "Calea"; | ||
| + | * un **JTextField**; | ||
| + | * un **JButton**; | ||
| + | * un **JScrollPane** care să conțină un **JTextArea**, setat inițial ca fiind invizibil. | ||
| + | |||
| + | După ce se va introduce o cale, către un fișier text aflat local pe disc, se va afișa conținutul acestui fișier în fereastră, uzitând componenta de tip **JTextArea**. | ||
| + | |||
| + | <note important> | ||
| + | Componenta de tip **JScrollPane** va deveni vizibilă la accesarea butonului, dacă există fișierul specificat local pe disc, în caz contrar, se va șterge conținutul din **JTextField**. | ||
| + | </note> | ||
| + | |||
| + | <code java> | ||
| + | File f = new File(path); | ||
| + | if(f.exists() && !f.isDirectory()) { | ||
| + | // ... | ||
| + | } | ||
| + | </code> | ||
| + | |||