Curs
Exceptii, grafica, sunete
Termenul 'exceptie' folosit in Java se refera la prevenirea aparitiei unei erori ce are sanse mari de aparitie. De exemplu, daca dorim sa incarcam un fisier care nu exista pe disc, atunci trebuie sa specificam acest lucru. Exceptiile sunt indicate prin aruncarea (thrown) lor si sunt detectate prin prinderea (catch) lor. Java foloseste cuvintele rezervate throws, throw, try, catch pentru rezolvarea acestor probleme. Prima structura de control pentru captarea erorilor este:
try
catch (ClasaExceptie e)
Semantica este simpla: se incearca executia instructiunilor din try (de exemplu, citirea unui intreg, citirea dintr-un fisier, scrierea intr=un vector etc). Daca acestea se executa fara eroare, atunci executia try-catch este finalizata. Daca insa apare o eroare, atunci se intra pe ramura catch si se rezolva exceptia aparuta (care este de tipul precizat-Exceptie).
Exemplu:
Un program Java care se ocupa de citirea unui intreg dintr-un textField.
import java.awt.*;
import java.applet.Applet;
import java.util.*;
import java.awt.event.*;
public class TryCatch extends Applet
implements ActionListener
public void actionPerformed(ActionEvent ev)
catch (NumberFormatException e)
}
}
}
Sa presupunem ca un program deschide cu succes un fisier, dar apare o eroare in timpul citirii din fisier. Este de dorit inchiderea fisierului in aceasta situatie. Pentru aceasta folosim finally.
Exemplu:
String linie;
try
}
catch (IOException e)
finally
Instructiunile din clauza finally sunt executate in ambele cazuri (chiar daca apare sau nu vre-o exceptie).
S-ar putea sa existe mai multe exceptii posibile intr-un try. Atunci extindem instructiunea adaugand clauze catch().
try
catch (ClasaExceptie1 e1)
catch (ClasaExceptie e2)
Singura restrictie a instructiunii try-catch-finally este ca trebuie sa exista macar un catch si un finnaly.
Am vazut in exemplul precedent ca se capteaza o eroare generata de parseInt din biblioteca Java (clasa Integer) Codul ei arata cam asa (doar structura):
public static int parseInt(String s) throws NumberFormatException
Asadar pentru a vedea ce exceptie arunca o functie sistem ne uitam la prototipul ei.
In exemplul urmator, vom vedea cum putem scrie propriile metode care pot ridica exceptii.
import java.io.*;
public class TestExceptii
catch (Exception e)
finally
}
}
private static void metoda1(int i) throws Exception
}
Clase de exceptii
Exista exceptii importante (de ex. OutOfMemoryError) si mai putin importante (de ex. NumberFormatException). Exista aproximativ 30 de exceptii, noi le amintim doar pe cele mai importante. Practic toate exceptiile fac parte din clasa Throwable ce are doua clase importante: Error si Exception. Clasa Error are exceptii care sunt dificil de rezolvat - nu este obligatoriu sa le 'prindem'. Clasa Exception este mai importanta, marea majoritate a exceptiilor din aceasta clasa sunt verificate (de compilator), deci trebuie sa le tratam cu try-catch.
Ierarhia exceptiilor arata cam asa:
Throwable
Erro (neverificate)
LinkageError
VirtualMachineError
OutOfMemoryError
Exception (verificate, cu exceptia lui RuntimeException)
RuntimeException (neverificata)
ArithmeticException
IndexOutOfBoundsException
ArrayIndexOutOfBoundsException
IllegalArgumentException
NumberFormatException
IOException (verificate)
FileNotFoundException
MalformedURLException
InterruptedException (verificata)
Alte clase ale lui Exception (toate verificate).
Exemple de 'prinderi'
1. deschiderea unui fisier:
try
catch (FileNotFoundException e)
2. procesarea unui sir:
int b[] = new int[100];
try
catch (ArrayIndexOutOfBoundsException e)
Grafica
Biblioteca AWT (Abstract Window Toolkit) contine o multime de clase si metode pentru interfetele grafice utilizator si ferestre. Vom prezenta in continuare, cutii de verificare (check boxes), grupuri de cutii de verificare sau butonate radio (group of check boxes), cutii de alegere, liste, arii text, panze sau tablouri (canvases), panouri (panels), manageri de proiecte (layout managers).
Abordarea generala consta in declararea componentelor, initializarea si adaugarea lor la ecranul proiectului. In plus, programul implementeaza o clasa de eveniment (implements), trebuie sa inregistreze componentele si trebuie sa le puna la dispozitie o metoda adecvata pentru ascultarea fiecarui eveniment.
Exemplu:
Evenimentele de tip click pe un buton sau <cr> intr-un camp text folosesc ActionListener. Deci, pentru rezolvarea lor, trebuie sa determinam sursa evenimentului.
Cutii de verificare
-utilizatorul poate specifica una sau mai multe optiuni intr-o cutie.
interfata ce trebuie implementata: ItemListener
declararea cutiei de verificare: private Checkbox cutie1;
creare unei cutii de verficare: cutie1 = new Checkbox('Eticheta1');
adaugarea la proiectul ecran: add(cutie1);
inregistrarea evenimentului la ascultator: cutie1.addItemListener(this);
rezolvarea evenimentului asociat unei cutii de verificare: suprascrierea metodei itemStateChanged.
public void itemStateChanged(ItemEvent e)
}
metoda getState() intoarce true daca cutia de verificare a fost selectata
Grupuri de cutii de verficare
Comparativ cu mai multe cutii de verificare, un grup de cutii de verificare are proprietatea ca exact o cutie de verficare este selectata. Cand se selecteaza alta cutie, atunci cea veche se deselecteaza automat. Singurele lucruri care difera fata de cutiile de verificare sunt definirea (crearea) si rezolvarea evenimentelor:
grupCutii = new CheckboxGroup();
Cutie1 = new Checkbox('Eticheta_1',grupCutii,false);
Cutie2 = new Checkbox('Eticheta_2',grupCutii,true);
public void itemStateChanged(ItemEvent e)
Observatii:
Doar o cutie de verificare din grupul de cutii este aprinsa, restul sunt stinse.
Codul complet al unui grup de cutii de verificare este mai jos:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class ButonRadio extends Applet implements
ItemListener
public void itemStateChanged(ItemEvent e)
}
Cutii de alegere
O cutie de alegere este o lista de optiuni precum un meniu. Un element poate fi ales din lista facand click pe el. Elementul selectat apare ca parte vizibila a listei.
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class ChoiceBoxes extends Applet implements
ItemListener
public void itemStateChanged(ItemEvent e)
}
}
Liste
O lista (grafica) este o lista de siruri text, din care unul sau mai multe elemente pot fi selectate.
Crearea unei liste se faec folosind constructorul List:
Exemplu:
List lista = new List(3, false); //specifica faptul ca doar trei elemente din lista sunt vizibile o data. Al doilea parametru, false, semnifica faptul ca doar un element poate fi selectat din lista.
Deoarece este o actiune, rezolvarea evenimentului se face astfel:
public void actionPerformed(ActionEvent e)
}
Daca dorim ca mai multe elemente sa fie simultan selectate, atunci al doilea parametru al constructorului trebuie sa fie true:
List lista = new List(4, true);
Atunci in metoda de rezolvare a evenimentului, trebuie sa obtinem sirul de elemente selectate:
String [] selectie = lista.getSelectedItems();
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class Liste extends Applet implements ActionListener
public void actionPerformed(ActionEvent e)
}
}
Arii text
Citirea textelor in AWT se face folosind campuri text si arii text. Crearea unei arii text se face apeland un constructor TextArea.
Exemplu:
TextArea t = new TextArea(10, 40); //cei doi parametri semnifica numarul de linii (10), apoi de coloane(40).
Avand un buton pentru rezolvarea evenimentului, citirea textului se poate face cu functia getText().
Exemplu:
public void actionPerformed(ActionEvent e)
Putem considera un buton pentru evenimentul selectare text din aria text.
Prelucrarea zonei selectate a textului se face folosind:
getSelectionStart() - intoarce indexul de start a selectiei
getSelectionEnd() - intoarce indexul de inceput a selectiei
getSelectedText() - intoarce textul selectat
Observatie:
'n' este considerat un singur caracter
Inserarea unui text intr-o arie text se face cu insertText(sir, index) care insereaza in obiectul de tip arie text, sirul sir, plecand de la indexul precizat.
Exemplu:
String sir = 'Inseram un sir';
int index=5;
text.insertText(sir, index);
Inlocuirea unui text intr-o arie text se face cu replaceRange(sir, start, final) sau replaceText(sir, start, final). Se inlocuieste in obiectul de tip arie text sirul cuprins intre start si final cu textul sir.
Exemple:
text.replaceRange('Text de inlocuit', 5 ,10); -textul existent intre indecsii 5-10 este inlocuit cu sirul 'Text de inlocuit'
text.replaceRange('', 5, 10) -textul cuprins intre indecsii 5-10 este sters
Observatie:
replaceText-este o forma invechita (de la o versiune precedenta Java) - deprecated
Adaugarea unei bucati de text se face cu append(sir) sau appendText(sir).
Acesta din urma este forma invechita.
Exemplu:
Un exemplu de cod Java care foloseste metodele precedente:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class Editor extends Applet implements ActionListener
public void actionPerformed(ActionEvent e)
if (e.getSource() == afisareText)
}
}
Panze (suprafete de desenare)
Pana acum am vazzut aplicatii in care desenul si butoanle erau in aceeasi fereastra. Problema este ca butoanele ar putea acoperi desenul. Panzele (canvasses) rezolva aceasta problema definind o arie separata unde se plaseaza desenul.
Un canvas este creat ca un obiect al unei clase mostenita din clasa Canvas (predefinita). Programatorul poate suprascrie functia paint().
Exemplu:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class ExempluCanvas extends Applet
}
class CanvasulMeu extends Canvas
}
Panouri (panels)
Panourile sunt folosite pentru gruparea unui numar de componente, spre deosebire de canvas-uri care sunt folosite pentru afisarea textului sau graficii intr-o arie dreptunghiulara.
Daca dorim un grup de butoane plasate in partea de sus a ferestrei si alt grup in partea de jos a ferestrei, atunci putem crea doua panouri pentru fiecare din aceste 2 grupuri.
Crearea unui panou se face apeland constructorul Panel();
Exemplu:
Panel p = new Panel();
Adaugam componentele la panou:
Button b1 = new Button('Apasa 1');
Button b2 = new Button('Apasa 2');
p.add(b1);
p.add(b2);
In final, se adauga panoul la fereastra applet-ului:
add(p);
Manageri de proiecte (Layout Managers)
Proiectul implicit pentru applet-uri se numeste flow-layout (proiect de flux). Acesta plaseaza componentele unul dupa altul pe linii.
Pentru aplicatii, proiectul implicit se numeste border-layout (proiect bordat) si plaseaza componentele in jurul marginilor ferestrei.
Pentru folosirea lui border-layout apelam:
setLayout(new BorderLayout());
Creem butoanele:
Button nord = new Button('Nord');
Button sud = new Button('Sud);
Specificam aria in care vor fi butoanele ('North', 'South', 'West', 'East',
'Center' sunt literali rezervati):
add('North', nord);
add('South', sud);
Putem crea acum un panel, in care putem sa plasam butoanele:
Panel top = new Panel();
top.add(nord);
add('North',top);
Exemplu:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class Paneluri extends Applet implements ActionListener
public void actionPerformed(ActionEvent ev)
if (ev.getSource() == sud)
if (ev.getSource() == vest)
if (ev.getSource() == est)
if (ev.getSource() == centru)
System.out.println(sir);
repaint();
}
public void paint(Graphics g)
}
Plasarea componentelor fara utilizarea unui manager de proiecte
Pentru a plasa componentele fara un proiect implicit (flow-layout), border-layout si altele), setam proiectul pe null:
setLayout(null);
Pentru dimensionarea si plasarea componentelor din container, putem utiliza metoda:
void setBounds(int x, int y, int latime, int inaltime);
unde x,y reprezinta coordonatele pozitiei componentei in container, iar
parametrii latime, inaltime reprezinta dimensiunile componentei.
Acelasi lucru se putea face si cu metodele: setLocation si setSize:
void setLocation(int x, int y);
void setSize(int latime, int inaltime);
unde parametrii au aceeasi semnificatie.
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class NouLayout extends Applet implements ActionListener
public void actionPerformed(ActionEvent ev)
if (ev.getSource() == b2)
if (ev.getSource() == b3)
System.out.println(sir);
repaint();
}
public void paint(Graphics g)
}
Afisarea de imagini grafice si sunete
Programele Java pot avea ca iesire grafica si sunete. Informatiile de grafica si sunete sunt memorate in fisiere.
Cele mai cunoscute formate de fisiere grafice sun GIF(Graphics Interchange Format) si JPEG (Joint Photografic Experts Group). Fisierele GIF au extensia .gif si folosesc pentru reprezentarea unui pixel 8 biti. Fisierele JPEG au
extensia .jpg si folosesc pentru reprezentarea unui pixel 24 biti. JPEG este mai bun si ca rezolutie ca GIF, ca si ca compresie superioara a informatiei grafice.
Recomandare
Folositi fisiere GIF cand aveti de reprezentat imagini in mai putin de 256 de culori.
Afisarea graficii
Presupunem ca dorim sa vizualizam o imagine grafica continuta in fiserul 'pictura.gif'. Exista doua etape:
1. declararea imaginii se alocarea de spatiu de memorie pentru ea:
Exemplu:
private Image image;
image = getImage(getDocumentBase(),'pictura.gif');
2. incarcarea imaginii din fisier in memoria calculatorului si afisarea lui pe ecran:
Exemplu:
boolean b = g.drawImage(image, 20, 20, 100, 100, this);
In continuare explicam functiile noi aparute. Exista mai multe metode de a preciza unde este fisierul grafic:
1. plasam fisierul grafic in acelasi director cu fisierul HTML (pagina Web) care apeleaza applet-ul. Apelul metodei getDocumentBase returneaza adresa URL a acestei pagini Web. Aceasta adresa este primul parametru al metodei getImage, care foloseste numele directorului pentru gasirea fisierului grafic specificat.
2. Specificam intreaga adresa Internet (URL) ca parametru functiei drawImage;
image = getImage('https://www.infoiasi.ro/pictura.gif');
3. Plasam fisierul grafic in acelasi director cu programul Java:
image = getImage(getCodeBase(),'pictura.gif');
Functia drawImage returneaza true daca toti bitii imaginii sunt disponibili.
Al doilea si al treilea paramentru reprezinta coordonatele stanga-sus ale dreptunghiului unde se va afisa imaginea. Urmatorii 2 parametri reprezinta latimea si inaltimea dreptunghiului specificat. Ultimul paramentru specifica un obiect asociat in timpul incarcatii imaginii. De obicei acesta este obiectul curent, adica this.
Exemplu:
Codul complet este mai jos:
import java.applet.Applet;
import java.awt.*;
public class Picture extends Applet
public void paint(Graphics g)
}
Sunete
Ca si imaginile grafice, sunetele sunt memorate in fisiere. Tipul de fisier cel mai utilizat este fisierul audio, cu extensia .au.
Mai intai declaram un obiect AudioClip:
AudioClip sunet;
Crearea unui obiect AudioClip implica precizarea metodei de incarcare a fisierului, precum si numele acestuia (pp. 'sound.au').
Exemplu:
AudioClip sunet = getAudioClip(getDocumentBase(),'sound.au');
Exista trei metode importante ale clasei AudioClip: play(), loop() si stop().
sunet.play() - 'canta' sunetul;
sunet.loop() - se repeta sunetul de la inceput;
sunet.stop() - se opreste din cantat;
Metodele play() si loop() doar initializeaza cantatul, dupa aceea revin. Programul Java poate sa se ocupe de altceva in timp ca sunetul este ascultat.
Exemplu:
Un exemplu de cod complet Java ce foloseste metodele discutate este:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Audio extends Applet
implements ActionListener
public void actionPerformed(ActionEvent event)
}
Obtinerea parametrilor de intrare ai applet-ului
Java pune la dispozitie si citirea parametrilor pentru un applet din fisierul HTML asociat. In acest fisier, intre <APPLET> si </APPLET> se pot scrie linii de forma:
<PARAM name=numeSir value=valoareSir>
Exemplu:
<APPLET class=Something.class
PARAM name='arg1' value='test'
PARAM name='arg2' value=100>
</APPLET>
Acesti parametri se pot obtine in applet prin apelarea metodei getParameter care are un argument String si intoarce String. Argumentul este sirul dupa care este identificat parametrul (sirul de dupa name), iar valoarea intoarsa este value.
Exemplu:
String s = getParameter('arg1');
Daca in fisierul HTML respectiv nu gasim nici un parametru cu numele respectiv ('arg1'), atunci getParameter intoarce null.
Exemplu:
if ( s == null )
s='Valoare implicita';
sau
if ((s=getParameter('arg1'))==null)
s='Valoare implicita';
In continuare prezentam un cod Java care foloseste functiile de mai sus:
//fisierul html
<title>Un exemplu de obtinere parametri</title>
<applet code='GetParam.class' width=440 height=380>
<PARAM name='arg1' value='test1'>
<param name='arg2' value=100>
</applet>
//fisierul java
import java.applet.*;
import java.awt.*;
public class GetParam extends Applet
public void paint(Graphics g)
}
Exercitii propuse spre implementare
1. Folosind TextArea si un buton, scrieti un program Java care calculeaza numarul de caractere si de linii din text.
2. Scrieti un program Java care creeaza o arie text si butoane pentru operatiile de stergere si copiere.
3. Scrieti un program Java care are 2 butoane si un TextField pentru citirea unui fisier grafic sau audio. Butoanele sunt corespunzatoare apelurilor getImage si getAudioClip. Programul trebuie deci sa citeasca numele unui fisier si sa-l afiseze (sa-l interpreteze).
Bonus o steluta la examen daca pentru amandoua cazurile (imagine sau sunet)
se va folosi un singur buton.
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |