Proiectare Interfete Grafice

  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Proiectare Interfete Grafice as PDF for free.

More details

  • Words: 25,370
  • Pages: 125
UNIVRSITATEA TITU MAIORESCU FACULTATEA DE INFORMATICA

PROIECTAREA INTERFEŢELOR GRAFICE

Lector univ. dr. Mironela Pîrnău

- 2009 1

Cuprins Modulul I. JAVA. GENERALITATI Modulul II. GRAPHIC USER INTERFACE Modulul III. UTILIZARE NETBEANS Modulul IV. COMPONENTELE SWING Modulul V. LUCRU CA BAZE DE DATE IN JAVA Modulul VI. APPLET-URI Modulul VII. APLICATII WEB IMPLEMENTATE IN JAVA Modulul VIII. ALTE APLICATII Bibliografie Model bilet examen

Nota finală care se va acorda fiecărui student va conţine următoarele componente în procentele menţionate: - colocviu final 60% - lucrari practice/ proiect, etc. 20% -teste pe parcursul semestrului 10% -teme de control 10% Conditia de participare la colocviu, este ca fiecare student, sa realizeze un “PROJECT” care va cuprinde minim 15 aplicatii practice, selectate din cele 8 module ale suportului de curs. Aplicatiile vor fi “comentate” si eventual personalizate. 2

MODULUL I

JAVA. GENERALITĂŢI Java este un mediu de programare ce oferă utilizatorului cadrul necesar şi uneltele necesare pentru dezvoltarea aplicaţiilor Java. Java este o tehnologie ce oferă suport dezvoltării de aplicaţii distribuite, independente de platformă. Programele Java pot rula pe diferite tipuri de platforme, cu condiţia ca pe aceste platforme să fie instalată o maşină virtuală Java deasupra platformei respective. Avantajul limbajului Java, comparativ cu alte limbaje de programare este conexiunea strânsă cu tehnologia Internet. Caracteristici ale limbajului Java Caracteristicile limbajului Java care l-au făcut şi-l fac un limbaj de succes pe piaţa actuală de software sunt prezentate in continuare: Simplitate Limbajul Java prezintă concepte fundamentale care sunt deosebit de simple. Programarea Java se poate învăţa în câteva săptămâni. Părţile redundante din alte limbaje au fost îndepărtate şi s-au păstrat doar părţile strict necesare. Tot în vederea simplităţii, tehnologia Java conţine aşa numitul Garbage Colector, care face ca programatorul să nu mai aibă grija dezalocării zonelor de memorie anterior alocate. Pentru cunoscătorii limbajului C++ acest lucru înseamnă că nu mai e nevoie de delete după new. Orientat pe obiecte Limbajul Java , spre deosebire de C/C++, este în întregime orientat pe obiecte. Nu există o aplicaţie în care să nu existe cel puţin un obiect, o clasă. În Java, orice, cu excepţia câtorva tipuri de date fundamentale, este un obiect. Tehnologia programării orientate pe obiecte (OOP – Object Oriented Programming) este singura care satisface cerinţele actuale ale dezvoltării software. Robust Se măreşte gradul de siguranţă al codului. Sunt două nivele de verificare pentru mărirea gradului de siguranţă: unul la compilare (prezent în marea majoritate a limbajelor) şi unul în timpul rularii. Ca urmare un program este mai puţin supus erorilor. Securitatea Într-o lume în care calculatoarele nu mai pot exista ca enităţi solitare, fără a fi conectate în reţea, problema securităţii este una din cele mai stringente. Problema care se pune este aceea a existenţei unui nivel de securitate în cadrul limbajului.Unul din principalele avantaje ale limbajului Java care l-au făcut atât de popular este gradul de securitate. Programele Java sunt făcute să ruleze în sisteme distribuite, şi calculatoarele pe care ele lucrează nu pot fi sigure de provenienţa programelor. Dinamic Java este un limbaj dinamic prin faptul că multe decizii privind evoluţia programului se iau în momentul rulării, la runtime. Datorită faptului că multe din aplicaţiile Java sunt preluate de pe Internet sub forma de applet-uri chiar în momentul execuţiei lor, deci din reţea, aceste programe pot fi actualizate să facă faţă noilor cerinţe, utilizatorul dispunând în orice moment de cea mai nouă variantă. Independent de platformă Unul din marile avantaje ale limbajului Java este independenţa de platformă. Se impunea această independenţă de platformă, ţinând cont de ideea de lucru în medii distribuite. 3

De fapt un program Java lucrează pe o singură maşină: maşina virtuală Java ( Java Virtual Machine- JVM ). Ca urmare a utilizării emulatorului un program Java poate rula pe orice platformă pentru care există un emulator Java. Partea negativă este caă folosirea emulatorului duce la marirea timpului de execuţie. Soluţia este compilarea just-in-time (JIT) care transformă întregul program Java în program maşină înainte de execuţia lui. Compilatoarele just-in-time lucrează ca şi interpretoarele doar că conversia nu se face la nivel de instrucţiune ci la nivel de program, crescând considerabil viteza de execuţie a programului Java. Suport pentru multithreading Multithreading-ul este cel care permite ca un program să execute mai multe sacini aparent în acelaşi timp, utilizând mai multe fire de execuţie (thread-uri). Java oferă suport multithreading la nivel de limbaj deci la cel mai jos nivel (clasa Thread) oferindu-i utilizatorului posibilitatea de a crea un nou fir de execuţie ca şi cum ar creea oricare alt obiect. Mai mult, Java permite comunicarea între firele de execuţie precum şi sincronizara lor. Interconexiunea cu browsere WWW Acesta este unul din avantajele care a facut limbajul Java aşa de popular. Multe din firmele care dezvoltă browsere WWW au implementat maşina virtuală Java în interiorul acestor browsere. Amintim cele mai utilizate browsere care suportă Java: Netscape Navigator al firmei Netscape şi Internet Explorer al firmei Microsoft. Având în vedere aceste caracteristici, Java s-a conturat ca un limbaj performant, care s-a impus în lumea informaticii.

Pachetul JDK La baza dezvoltării unui program Java stă mediul de dezvoltare pus la dispoziţie de firma Sun. Acesta este Java Developers Kit (JDK) şi trebuie considerat ca mediu de referinţă în programarea Java. Mediul JDK conţine pe de o parte o serie de biblioteci de clase Java necesare scrierii unui program şi pe de o parte un set de utilitare necesare compilării, testării, execuţiei şi documentării unei aplicaţii Java. O clasă, un fişier bytecode cu extensia .class, reprezintă unitatea fundamentală a unui program executabil Java. O bibliotecă de clase cuprinde o serie de clase ce au un numitor comun. O astfel de bibliotecă este cunoscută în java sub numele de package. JDK-ul conţine câteva package-uri fundamentale, package-uri care conţin clase fără de care nu se pot dezvolta aplicaţii Java. Package-urile Java incluse în JDK formează principalul API- Application Programming Interface. Orice alt mediu care poate executa aplicaţii Java diferit de mediul JDK trebuie să includă acest API. Pe lângă aceste pachete fundamentale, utilizatorul poate folosi şi altele dezvoltate chiar de el. Trebuie însă să se asigure că aceste pachete adiţionale sunt disponibile şi pe platforma pe care aplicaţia se execută, nu numai unde aceasta a fost creată. 4

Cuvântul cheie import este folosit pentru a face cunoscută utilizarea unei clase dintru-un package sau a unui întreg package. Exemplu: import java.sql.*; import java.awt.Graphics; import java.applet.Applet; Un package este o colecţie de clase şi interfeţe Java între care există o relaţie de asociere. Prin utilizarea conceptului de package, Java oferă un mecanism de mamagement al identifiactorilor (numelor) care se pot atribui claselor (”name spaces”). Printr-un package Java se pot rezolva eventualele conflicte ce pot apărea datorită existenţei a două clase cu acelaşi nume. Astfel dacă avem clasa Rectangle din package-ul java.awt , putem avea aceeaşi clasă Rectangle din pachetul myPackage. Dacâ în program dorim să utilizăm clasa Rectangle din java.awt atunci se specifică aceasta prin import java.awt

Amintim unele package-uri din Java API package java.applet Pachetul conţine clasele necesare dezvoltării unui applet (program Java ce se execută în cadrul unui browser WWW) package java.awt., java.awt.event, package javax.swing; Pachete ce se folosesc în dezvoltarea interfeţelor grafice de comunicare cu utilizatorul şi dezvoltarea aplicaţiilor ce implică grafică package java.beans Conţine clase necesare implementării tehnologiei Java Beans, o tehnologie orientată pe crearea unor componente ce pot fi reutilizate. package java.io Pachetul include clasele necesare lucrului cu stream-uri package java.lang Conţine clasele fundamentale fără de care un program Java nu poate exista. package java.math Este utilizat pentru lucrul cu funcţii matematice package java.net Pachetul conţine clasele necesare programării în reţea package java.rmi Pachet utilizat pentru creearea unor aplicaţii Java ce lucrează în sisteme distribuite (RMI Remote Method Invocation). Uşurează apelul unor 5

metode din obiecte disponibile pe diferite computere ce sunt conectate în reţea. package java.security Pachet ce priveşte asigurarea unui mecanism de securitate al sistemului software dezvoltat. package java.sql Pachetul se foloseşte în vederea lucrului cu bazele de date. package java.text Pachetul este utilizat pentru lucrul cu texte. package java.util Oferă suport pentru lucrul cu liste, vectori, dicţionare, informaţii legate de dată şi timp. package java.util.zip Este utilizat în aplicaţii ce presupun utilizarea unor algoritmi de compresie şi decompresie Pe lângă Java API pachetul JDK pune la dispoziţia programatorului o serie de unelte necesare dezvoltării, testării, analizei şi documentării programelor Java. Dintre acestea amintim: javac- Java Language Compiler Acesta este compilatorul java care realizează transformarea surselor text scrise în limbaj de programare Java în codul executabil pe maşina virtuală Java ( JVM ), în bytecodes, in clase java (fişiere cu extensia .class). Fişierul sursă (text limbaj Java) cu extensia .java se transmite ca şi paramentru în programul javac. javac

HelloJava.java

java – Java Interpreter Acesta este interpetorul Java care execută programele Java (bytecodes, fişiere class) . Prin lansarea în execuţie a acestui utilitar se porneşte de fapt JVM. Programul emulează JVM convertind instrucţiunile JVM în instrucţiuni ale maşinii reale. Este util în execuţia aplicaţiilor Java standalone nu şi a applet-urilor. Are ca paramentru numele fişierului rezultat în urma compilării. java HelloJava jre –Java Runtime Interpreter Este similar cu interpretorul java dar este o variantă mai simplificată jre HelloJava jdb – Java Language Debugger 6

Este unealta utilizată pentru depanarea programelor Java javah – Java Header Este utilizat pentru a permite programelor scrise în limbajul Java să comunice cu programele scrise în limbajul C. Cu javah se creează fişiere header C şi fişiere stub C necesare pentru a reliza această conexiune. javadoc – Java Document Cu acest instrument se generează documenţia programelor Java în format html. Documentarea se face pe baza comentariilor din program. Programul javadoc se aplică asupra fişierelor sursă .java javadoc HelloJava.java appletviewer Utilitarul este utilizat pentru testarea appleturilor. Programul lansează în execuţie o maşină virtuală Java. Este un browser minimal de WWW care suportă toate caracteristicile Java ale mediului jdk din care provine.

PROGRAMAREA OBIECTUALĂ ÎN JAVA Faţă de programarea structurată, programarea orientată pe obiecte (Object Oriented Programming - OOP) s-a impus ca tehnologie de programare datorită numeroaselor sale avantaje. Aceste avantaje au în vedere întreţinerea şi depanarea codului, dezvoltarea proiectelor sofware, reutilizarea codului (librăriile dezvoltate pot fi utilizate în alte proiecte).

Clasa – Aceasta oferă posibilitatea clasificării unor obiecte pe baza unor proprietăţi comune. Se consideră că noţiunea de clasă este similară cu noţiunea de tip de date. Atributele împreună cu metodele definite într-o clasă constituie membrii clasei. Când creăm un obiect dintr-o clasă se dă consistenţă acestor atribute. Crearea unui obiect se numeşte şi instanţierea unei clase. Noţiunea de obiect nu poate exista fără cea de clasă şi invers. Încapsularea - Acest termen defineşte accesul la membrii unei clase. Un atribut sau o metodă a unui obiect (clase) poate fi accesat de alt obiect exterior sau nu. Pentru anumiţi membrii a unei clase nu se doreşte accesul lor din afară. Ca urmare, aceşti membrii sunt încapsulaţi în interiorul clasei fără a fi vizibili din exterior. Accesul la un membru al unei clase se face prin intermediul unor specificatori de acces (cuvinte cheie). Constructorul – În momentul creării unui obiect al unui clase există o metodă specială a acestei clase. Metoda este apelată la crearea unui obiect imediat după crearea şi iniţializarea fiecărui atribut al clasei. Constructorul nu este considerat un membru al clasei.

7

Moştenirea – Se poate defini o clasă, folosind o clasă definită anterior pe baza unei relaţii de apartenenţă ce există între ele. O clasă poate aparţine unei clase anterior definite. Prima se numeşte clasă derivată iar cea de a doua se numeşte clasa de bază . Polomorfism – Polimorfismul este o caracteristică a OOP prin care un obiect se adaptează în funcţie de contextul de program în care apare luând diferite forme (poate fi de diferite tipuri - clase). Polimorfismul este in strânsă legătură cu conceptul de moştenire.

Exemplu de declaraţii de clase: class Dreptunghi; public abstract class Patrulater; //clasă abstractă şi publică public class Patrat exdends Patrulater; //Patrat clasă publică derivată //din clasa Patrulater public final class String //clasa String este publică şi //finală public class Romb extends Patrat implements Patrulater ; //Romb mosteneste clasa //Patrat si implemeteaza //interfata Patrulater După declaraţia unei clase urmează definirea corpului ei, definire ce se face în cadrul unui bloc delimitat de acolade. Corpul unei clase conţine o serie de declaraţii de membrii ai clasei şi constructori. Membrii unei clase sunt atributele şi metodele. Constructorii unei clase reprezintă o categorie aparte de funcţii utilizate la iniţializarea unui obiect . Se obişnuieşte ca atributele să fie declarate înaintea metodelor .Nu există o ordine a declaraţiilor. Un membru, fie că este atribut sau metodă, declarat într-o clasă este disponibil prin identificatorul lui, oriunde în interiorul clasei. Spunem că membrul unei clase are domeniul de vizibilitate (scope) corpul clasei. Se poate concluziona cum că există trei tipuri de declaraţii în interiorul unei clase şi aceste declaraţii sunt declaraţii de atribute, de metode şi de constructori. 8

Interfata (interface) O interfata Java defineste un set de metode dar nu specifica nici o implementare pentru ele. O clasa care implementeaza o interfata trebuie obligatoriu sa specifice implementari pentru toate metodele interfetei, supunându-se asadar unui anumit comportament. Definitie O interfata este o colectie de metode fara implementare si declaratii de constante Definirea unei interfete se face prin intermediul cuvântului cheie interface: [public] interface NumeInterfata [extends SuperInterfata1 [,extends SuperInterfata2...]] { //corpul interfetei:constane si metode abstracte } Implementarea unei interfete ---se face prin intermediul cuvântului cheie implements: class NumeClasa implements NumeInterfata sau class NumeClasa implements Interfata1, O interfata defineste un protocol ce poate fi implementat de orice clasa, indiferent de ierarhia de clase din care face parte. Interfetele sunt utile pentru: o o

o

definirea unor similaritati între clase independente fara a forta artificial o legatura între ele. asigura ca toate clasele care implementeaza o interfata pun la dipozitie metodele specificate în interfata; de aici rezulta posibilitatea implementarii unitare a unor clase prin mai multe modalitati. specificarea metodelor unui obiect fara a deconspira implementarea lor (aceste obiecte se numesc anonime si sunt folosite la livrarea unor pachete cu clase catre alti programatori: acestia pot folosi clasele respective dar nu pot vedea implementarile lor efective) 9

MODULU II Graphic User Interface Aplicatiile Java se impart in trei mari clase 1. Aplicatii de sine statatoare (stand-alone) 2. Aplicatii rulate pe clientul http (applets). Apleturile sunt executate de catre un browser care are implementata masina virtuala java (java enabled browsers). 3. Aplicatii rulate pe server (servlets). Servleturile sunt similare apleturilor prin aceea ca sunt extensii dinamice (adica se lanseaza in executie cand aplicatia ruleaza deja) ale aplicatiilor. Aplicatiile de sine statatoare se impart dupa tipul de interfatei cu utilizatorul in: a. Aplicatii de consola. Gen de interfata orientata pe caracter precum interfata sistemului de operare dos, sau interfata la livel de consola din UNIX. b. Aplicatii grafice (interfata grafica de tip fereastra). Aceste interfete folosesc GUI (Graphic User Interface). Aplicatiile ce ruleaza pe server sau pe client necesita ca serverul sau clientul sa fie java enabled. Mai precis, aplicatiile server/client sa aiba implementate masina virtuala Java. Interfaţa grafică sau, mai bine zis, interfaţa grafică cu utilizatorul (GUI), este un termen cu înţeles larg care se referă la toate tipurile de comunicare vizuală între un program şi utilizatorii săi. Aceasta este o particularizare a interfeţei cu utilizatorul (UI), prin care vom înţelege conceptul generic de interacţiune între un program şi utilizatorii săi. Biblioteca de clase care oferă servicii grafice se numeşte java.awt, AWT fiind prescurtarea de la Abstract Window Toolkit şi este pachetul care care a suferit cele mai multe modificări în trecerea de la o versiune JDK la alta.

Structura de clase din Swing este asemănătoare cu cea din AWT, în sensul că toate componentele interfeţei grafice sunt derivate dintr10

un singur părinte numit JComponent (care este derivat din clasa AWT Container). Pachetul de clase Swing reprezintă soluţia furnizată de Sun pentru crearea unor interfeţe utilizator grafice complet portabile pe orice platformă. În Swing, toate numele claselor încep cu litera J, şi atunci când este posibil, numele este acelaşi cu cel al clasei AWT pe care o înlocuieşte. La fel ca la AWT, punctul de plecare pentru un program bazat pe Swing, este clasa JFrame sau clasa JApplet. În principiu, crearea unei aplicaţii grafice presupune următoarele lucruri: - crearea unei suprafete de afişare (cum ar fi o fereastră) pe care vor fi aşezate obiectele grafice care servesc la comunicarea cu utilizatorul (butoane, controale de editare, texte, etc); - crearea şi aşezarea obiectelor grafice pe suprafata de afişare în poziţiile corespunzatoare; - definirea unor acţiuni care trebuie să se execute în momentul când utilizatorul interacţionează cu obiectele grafice ale aplicatiei; - "ascultarea" evenimentelor generate de obiecte în momentul interacţiunii cu utilizatorul şi executarea acţiunilor corespunzătoare aşa cum au fost ele definite. Majoritatea obiectelor grafice sunt subclase ale clasei Component, clasa care defineşte generic o componentă grafică şi care poate interacţiona cu utilizatorul. Singura excepţie o constituie meniurile care descind din clasa MenuComponent. Asadar, print-o componentă sau componentă grafică vom înţelege în continuare orice obiect care are o reprezentare grafică ce poate fi afişată pe ecran şi care poate interacţiona cu utilizatorul. Exemple de componente sunt ferestrele, butoanele, bare de defilare, etc. In general, toate componentele sunt definte de clase proprii ce se găsesc în pachetul java.awt, clasa Component fiind superclasa abstractă a tuturor acestor clase. Crearea obiectelor grafice nu realizează automat şi afişarea lor pe ecran. Mai întâi ele trebuie aşezate pe o suprafaţă de afişare, care poate fi o fereastră sau suprafaţa unui applet, şi vor deveni vizibile în momentul în care suprafaţa pe care sunt afişate va fi vizibilă. O astfel de suprafaţă pe care se asează obiectele grafice reprezintă o instanţă a 11

unei clase obţinută prin extensia clasei Container; din acest motiv suprafeţele de afişare vor mai fi numite şi containere. Clasa Container este o subclasă aparte a clasei Component, fiind la rândul ei superclasa tuturor suprafeţelor de afişare Java (ferestre, applet-uri, etc). Aşa cum am vazut, interfaţa grafică serveşte interacţiunii cu utilizatorul. De cele mai multe ori programul trebuie să facă o anumită prelucrare în momentul în care utilizatorul a efectuat o acţiune şi, prin urmare, obiectele grafice trebuie să genereze evenimente în funcţie de acţiunea pe care au suferit-o (actiune transmisă de la tastatură, mouse, etc.). Un eveniment este produs de o acţiune a utilizatorului asupra unui obiect grafic, deci evenimentele nu trebuie generate de programator. In schimb într-un program trebuie specificat codul care se execută la aparitia unui eveniment. Interceptarea evenimentelor se realizează prin intermediul unor clase de tip listener (ascultator, consumator de evenimente), clase care sunt definite în pachetul java.awt.event. In Java, orice componentă poate "consuma" evenimentele generate de o altă componenta grafică. Exemplu: crearea unei ferestre ce conţine două butoane utilizand AWT. import java.awt.*; public class exemplu1{ public static void main(String args[]) { //creez fereastra - un obiect de tip frame Frame f = new Frame("O fereastra"); //setez modul de dipunere a ob. pe suprafata ferestrei f.setLayout(new FlowLayout()); //creez cele doua butoane Button b1 = new Button("OK"); Button b2 = new Button("Cancel"); //adaug primul buton pe suprafata ferestrei f.add(b1); f.pack(); //adaug al doile buton pe suprafata ferestrei f.add(b2); f.pack(); //afisez fereastra (o fac vizibila) f.show(); }}

12

Modulu III Utilizare NETBEANS Aplicatia 1 .Crearea unui nou proiect NetBeans IDE Java Quick Start Tutorial Acest ghid oferă o introducere foarte simplu şi rapid, pentru fluxul de lucru NetBeans IDE de mers pe jos vă prin crearea unui simplu "Hello World" Java Console cerere. Odată ce aţi terminat cu acest tutorial, veti avea o cunoaştere generală a modului de a crea şi rula aplicaţii în IDE. Acest tutorial durează mai puţin de 10 minute. După ce terminaţi acest tutorial, puteţi trece la trasee de învăţare, care sunt legate de la documentare, Training & pagina de sprijin. Partii de învăţare prevăd tutoriale cuprinzătoare care evidenţiază o gamă mai largă de caracteristici IDE şi tehnici de programare pentru o varietate de tipuri de aplicare . Dacă nu vrei să faci un "Hello World" aplicaţie, puteţi sări peste acest tutorial si sari direct la trasee de învăţare.



Configurarea de proiect



Adăugarea Cod la Sursa Generated File



Compilarea şi Running Cerere



De constructii si Implementarea Cerere



Etapele următoare Pentru a completa acest tutorial, aveţi nevoie de următoarele produse software şi resurse.

Software-ul sau de Resurse

Versiune Required

NetBeans IDE

Versiunea 6.7

Java Development Kit (JDK)

versiunea 6 sau versiunea 5

Configurarea de proiect Pentru a crea un proiect IDE: 1.

Start NetBeans IDE.

2.

În IDE, alegeti File> New Project (Ctrl-Shift-N), aşa cum se arată în figura de mai jos.

13

3.

În expertul New Project, extindeţi categoria Java şi selectaţi aplicaţie Java aşa cum se arată în figura de mai jos. Apoi, faceţi clic pe Next.

4.

În numele şi locaţia de start a expertului, faceţi următoarele (după cum se arată în figura de mai jos):

o

În domeniul Denumirea proiectului HelloWorldApp tip,.

o

Lăsaţi Utilizare Pliant dedicate pentru stocarea caseta de selectare de Biblioteci neselectată.

o

În Creaţi principal domeniu de clasă, helloworldapp.HelloWorldApp tip.

o

Lasă Setare ca principale caseta de selectare de proiecte selectate.

14

5.

Faceţi clic pe Terminare.

Proiectul este creat şi a deschis în IDE. Ar trebui să vedeţi următoarele componente:



Fereastra proiecte, care conţine o vizualizarea arborescentă a componentelor proiectului, inclusiv fişierele sursă, biblioteci care depinde codul dvs., şi aşa mai departe.



Fereastra Sursa Editor cu un fisier numit HelloWorldApp deschis.



Fereastra Navigator, pe care o puteţi utiliza pentru a naviga rapid între elemente din cadrul clasei selectat.

15

Adăugarea Cod la Sursa Generated File Pentru ca tu ai plecat de la Crearea principale clasa caseta de selectare de selectat în expertul New Project, IDE a creat o clasă schelet pentru tine. Puteţi adăuga "Hello World!" mesaj de la codul scheletului prin înlocuirea linie:

/ / Cod TODO aplicarea logica aici

cu linia: System.out.println ( "Hello World!"); A memora modificarea prin alegerea Fişier> Salvare. Fişierul ar trebui să arate ceva de genul mostra de cod de mai jos.

/ * * Pentru a schimba acest şablon, alegeti Tools | Template-uri

16

* Şi deschide şablon în editor. * /

HelloWorldApp pachet;

public class HelloWorldApp ( public static void main (String [] args) ( System.out.println ( "Hello World!"); ) )

Compilarea şi Rularea programului Din cauza Compilarea IDE pe caracteristica Salvare, tu nu trebuie să compilaţi manual proiectului dvs. pentru a rula în IDE. Când salvaţi un fişier sursă Java, IDE automat compilează ea. Pentru a rula programul:



Alegeţi Run> Run Main Project (F6). Figura următoare arată ceea ce ar trebui să vedeţi acum.

Felicitări! Lucrările Tale program! Dacă există erori de compilare, acestea sunt marcate cu simbolurile roşu în marginile din stânga şi din dreapta a Editor Source. Simbolurile, în marginea din stânga a indica erorile pentru liniile corespunzătoare. Simbolurile în marja de dreptul de a afişa toate zonele din dosar care au erori, inclusiv erori, în linii care nu sunt vizibile. Aveţi posibilitatea să cursorul peste un semn de eroare pentru a obţine o descriere a erorii. Aveţi posibilitatea să faceţi clic pe un simbol în marja de dreptul de a sări la linia cu eroarea.

De constructii si Implementarea Cerere 17

După ce aţi scris şi testa rula aplicaţia dvs., puteţi utiliza comanda "curate" şi Generare pentru a construi cererea dumneavoastră, în vederea detaşării. Când utilizaţi Clean şi comanda Construirea, IDE opereaza un construi script care îndeplineşte următoarele atribuţii:



Şterge orice dosar anterior elaborate, precum şi a altor construi ieşiri.



Recompiles cerere şi construieşte o JAR fişier care conţine fişiere compilate. Pentru a construi cererea dumneavoastră:



Alegeţi alerga> "curate" şi Build principale ale proiectului (Shift-F11). Puteţi vedea construi iesiri prin deschiderea fereastra Fişiere şi extinderea nodul HelloWorldApp. Bytecode compilat fişier HelloWorldApp.class este în build/classes/helloworldapp subnode

build/classes/helloworldapp Dislocabile JAR Un fişier care conţine HelloWorldApp.class este în nodul dist

18

Aplicatia 2 .Proiectarea unei GUI leagăn în NetBeans IDE

Această ghiduri tutorial vă prin procesul de creare a interfaţa grafică (GUI) pentru o aplicaţie numită ContactEditor folosind NetBeans IDE GUI Builder. În acest proces, veţi layout GUI un front-end care vă permite de a vizualiza şi edita informaţiile de contact ale persoanelor fizice sunt incluse într-o bază de date angajat. În acest tutorial veţi învăţa cum să:



Utilizaţi GUI Builder Interface



Creaţi un container GUI



Adaugarea de componente



Redimensionare Components



Aliniaţi Componente



Reglarea Componenta de ancorare



Set Componenta Auto-Redimensionarea Behavior



Edit Component Properties Acest tutorial durează aproximativ 30 de minute. Pentru a completa acest tutorial, aveţi nevoie de următoarele produse software şi resurse.

Software-ul sau de Resurse

Versiune Required

NetBeans IDE

versiunea 6.7, 6.5, 6.1 sau

Java Development Kit (JDK)

versiunea 6 sau versiunea 5

Noţiuni de bază GUI IDE lui Builder face posibil de a construi aspect profesional GUIs, fără o înţelegere profundă a managerilor de aspect. Puteţi stabili formularele, prin plasarea componentelor în cazul în care le doriţi.

Crearea unui proiect Deoarece toate dezvoltare Java în IDE are loc în cadrul proiectelor, va trebui mai întâi pentru a crea un nou proiect ContactEditor în care pentru a stoca surse şi fişiere alt proiect. Un proiect IDE este un grup de fişiere sursă Java, plus datele sale asociate Meta, inclusiv proiecte specifice de fişiere proprietăţi, o furnică construi script care controlează construi şi rula setări, şi un fişier de project.xml unor hărţi Ant

19

obiective pentru a IDE comenzi. În timp ce aplicaţii Java adesea consta din mai multe proiecte de IDE, în sensul de acest tutorial, vom construi o aplicatie simpla, care este stocată în întregime într-un singur proiect.

Pentru a crea un proiect de ContactEditor nouă cerere: 1.

Alege File> New Project. Alternativ, aveţi posibilitatea să faceţi clic pe pictograma Proiect Nou în bara de instrumente IDE.

2.

În panoul de Categorii, selectaţi nodul Java şi în panoul de proiecte, alegeţi aplicaţie Java. Faceţi clic pe Următorul.

3.

Introduceţi ContactEditor în domeniul Denumirea proiectului şi specificaţi locaţia proiectului.

4.

Lăsaţi Utilizare Pliant dedicate pentru stocarea caseta de selectare de Biblioteci neselectată.

5.

Asiguraţi-vă că Setare ca principale caseta de proiect este selectat şi clară Crearea principal domeniu de clasă.

6.

Faceţi clic pe Terminare. IDE creează dosarul ContactEditor pe sistemul dumneavoastră în locaţia desemnate. Acest dosar conţine toate fişierele proiectului asociate, inclusiv script-ul de Ant, foldere pentru stocarea surselor şi teste, precum şi un dosar pentru un proiectmetadate specifice. Pentru a vizualiza structura de proiect, utilizaţi fereastra IDE's Files.

Crearea unui container interfaţă grafică După crearea noua aplicaţie, este posibil să fi observat că Pachetele dosarul Sursa în fereastra de Proiecte conţine un <default gol package> nod. Pentru a începe construirea interfata noastra, avem nevoie de a crea un container Java în cadrul căruia vom plasa componentele necesare alte GUI. În acest pas vom crea un recipient cu ajutorul componentei JFrame şi locul recipientul într-un ambalaj nou.

Pentru a crea un container JFrame: 1.

În fereastra Proiecte, faceţi clic dreapta pe nodul ContactEditor şi a alege nou> JFrame Form.

2.

Introduceţi ContactEditorUI ca numele clasei.

3.

Introduceţi my.contacteditor ca pachet.

4.

Faceţi clic pe Terminare. IDE creează forma ContactEditorUI şi clasa de ContactEditorUI în cadrul cererii ContactEditorUI.java şi deschide formularul ContactEditorUI În Generatorul GUI. Observaţi că pachetul my.contacteditor înlocuieşte implicit de pachet.

Să ne familiarizăm cu GUI Builder Acum, că ne-am creat un nou proiect pentru a aplicaţiei noastre, sa ia un minut pentru a ne familiariza cu interfaţă GUI Builder lui. Pentru a explora interfaţă GUI Builder cu un demo interactiv, faceţi clic pe Vizualizare pictograma Demo.

20

Când ne-am adăugat recipient JFrame, IDE a deschis formularul de nou-create ContactEditorUI întro filă Editor cu o bară de instrumente care conţine mai multe butoane, aşa cum se arată în ilustraţie precedent. Formularul ContactEditor deschis, având în vedere Builder GUI's Design si trei ferestre suplimentare, a apărut în mod automat de-a lungul marginilor IDE lui, permiţându-vă să navigheze, să organizaţi şi edita forme GUI cum ai construi ei. Windows Constructorul GUI diferitele includ: Design Area. Ferestrei Builder GUI's primare pentru crearea şi editarea forme Java GUI. Sursa



a Barei de instrumente şi butoanele de design comuta vă permit să vizualizaţi codul sursă al unei clase sau o vizualizare grafică a componentelor sale GUI. Butoanele suplimentare bara de instrumente furnizează acces convenabil la comenzi comune, cum ar fi alegerea între Selecţia şi moduri de conectare, alinierea componente, setarea pentru componente auto-redimensionare comportament, şi previewing forme.

21



Inspector. Oferă o reprezentare a tuturor componentelor, atât vizuale şi non-vizuale, în cererea dumneavoastră ca o ierarhie copac. Inspector oferă, de asemenea feedback vizual despre ceea ce componenta în arborele este în prezent în curs de editare în Builder GUI, precum şi vă permite să organizaţi componente în panourile disponibile.



Palette. O listă personalizabil de componente disponibile care conţin file pentru a JFC / Swing, AWT, precum şi componente JavaBeans, precum şi managerii de aspect. În plus, puteţi crea, eliminaţi, a rearanja categorii afişat în paleta de utilizând Customizer.



Proprietăţi de ferestre. Afişează proprietăţile din componenta selectat în Builder GUI, fereastra Inspector, fereastra Proiecte, sau fereastra Files. Dacă faceţi clic pe butonul Sursa, IDE afişează Java aplicaţiei codul sursă în Editorul cu secţii de cod care sunt generate automat de către constructor GUI indicat de zonele de albastru, numit pazita Blocuri. Blocuri pazita sunt zone protejate care nu sunt editabile în Vezi sursa. Aveţi posibilitatea să editaţi numai codul care figurează în zonele albe de Editor atunci când, în Vezi sursa. Dacă aveţi nevoie pentru a face modificări la Codul într-un bloc pazita, făcând clic pe butonul Design revine editorului IDE la Builder GUI în care puteţi efectua modificările necesare la forma. Când salvaţi modificările, actualizările IDE sursele fişierului. Notă: Pentru dezvoltatorii de avansat, o Customizer Palette este disponibil care vă permite să adăugaţi elemente personalizate de la JAR-uri, biblioteci, sau în alte proiecte la Palette.

Concepte de bază GUI IDE lui Builder rezolvă problema de bază de Java crearea de GUI prin fluidizarea fluxului de lucru, de a crea interfeţe grafice, eliberând dezvoltatorii de la complexitatea Swing manageri de aspect. Ea face acest lucru prin extinderea actuală NetBeans IDE GUI Builder pentru a sprijini o simplă "Free Design" paradigma cu regulile de layout simplu, care sunt uşor de înţeles şi de folosit. Pe măsură ce pune în formularul dvs., Generatorul mediu grafic oferă orientări vizual sugerând spaţierea optime şi de aliniere a componentelor. În fundal, Builder GUI traduce deciziile de design într-un UI funcţionale care este implementat folosind managerul de GroupLayout nou layout şi Swing alte construcţii. Pentru că foloseşte un model dinamic de aspect, GUI's construit cu Builder GUI se comportă ca şi v-aţi aştepta la runtime, de adaptare pentru a acomoda orice modificările pe care le face fără a modifica raporturile definite între componente. Ori de câte ori îl redimensionaţi forma, locales comutator, sau specifica un alt aspectul, GUI reglează automat de a respecta uite ţintă şi Introduceri simt şi compensează.

Designul fără În GUI IDE lui Builder, vă puteţi construi formularele dvs. pur şi simplu prin punerea componente în cazul în care doriţi să le ca şi cum aţi folosit de poziţionare absolută. GUI Cifrele Builder în care atribute de aspect sunt necesare şi apoi generează codul pentru tine în mod automat. Nu trebuie să te privesc cu introduceri, ancore, umple, şi aşa mai departe.

22

Automat Componenta de poziţionare (snapping) Pe măsură ce adăugaţi componente de la o formă, Builder grafic oferă feedback vizual care ajută în componente de poziţionare bazat pe sistemul de operare sa ne uitam si sa se simta. Generator grafic oferă sfaturi utile inline şi feedback-ul vizual în ceea ce priveşte alte componente în cazul în care ar trebui să fie introduse pe formularul dvs., în mod automat se rupă componente în poziţia de-a lungul liniilor directoare. Aceasta face ca aceste sugestii bazate pe poziţiile de componente care au fost deja introduse in forma, permiţând în acelaşi timp padding să rămână flexibile, astfel încât arată diferit ţintă şi se simte face în mod corespunzător în timpul rulării.

Visual Feedback Builder GUI prevede, de asemenea feedback-ul vizual în ceea ce priveşte componenta de ancorare şi înlănţuirea relaţii. Aceşti indicatori vă permit să identifice rapid diversele relaţii de poziţionare şi componenta fixarea comportament care afectează modul în GUI dvs. vor apărea atât şi să se comporte în timpul rulării. Aceasta viteza procesului de proiectare GUI, permiţându-vă să creaţi rapid cu aspect profesional interfete vizuale pe care locul de muncă.

Sa incepem cu inceputul Acum, că aţi familiarizat-vă cu interfaţă GUI Builder lui, este timpul să înceapă în curs de dezvoltare UI de aplicare noastre ContactEditor. În această secţiune vom arunca o privire la utilizarea Palette IDE de a adăuga diferitelor componente GUI de care avem nevoie pentru a forma nostru. Vă mulţumim pentru Drum liber IDE a paradigmei de proiectare, tu nu mai trebuie să lupte cu managerii layout pentru a controla dimensiunea şi poziţia a componentelor în termen de containere dumneavoastră. Tot ce trebuie sa faci este drag şi drop (sau murături şi plop), componentele care aveţi nevoie pentru a forma dvs. de GUI aşa cum se arată în ilustraţii care urmează.

Adăugarea de componente: Noţiuni de bază Deşi GUI IDE lui Builder simplifică procesul de creare a Java GUI, este adesea util să schiţeze aşa cum doriţi interfaţa dumneavoastră de a privi înainte de a începe să se stabilească it afarã. Designeri interfaţă Mulţi consideră acest lucru o practică cele mai bune "," tehnica, cu toate acestea, în sensul acestui tutorial puteti peek pur şi simplu, la modul în care formularul nostru de completat ar trebui să arate, sărind înainte de secţiunea Examinarea dvs. de GUI. Deoarece am adăugat deja un JFrame ca formularul nostru de top a lui recipient de nivel, următorul pas este de a adăuga o pereche de JPanels care ne va permite să cluster componentele UI nostru folosind frontierele intitulata. Se referă la următoarele ilustraţii şi anunţul "IDE's Pick şi a cădea în apă", atunci când realizarea acestui comportament.

23

Pentru a adăuga un JPanel: 1.

În fereastra Palette, selectaţi componenta Panoul din categoria Swing, făcând clic pe şi de eliberare a butonul mouse-ului.

2.

Mutaţi cursorul în colţul din stânga sus a formularului În Generatorul GUI. În cazul în care componenta este situată aproape de marginile containerului de sus şi stânga, liniile directoare orizontale şi verticale de aliniere par să indice marjele de preferat. Faceţi clic pe formularul de a plasa JPanel în această locaţie. Componenta JPanel apare în formularul de ContactEditorUI cu portocaliu subliniind, ceea ce înseamnă că acesta este selectat, după cum se arată în ilustraţia următoare. Dupa lansarea butonul mouse-ului, indicatorii mici par să demonstreze relaţii de componenta de ancorare şi un nod corespunzător JPanel este afişat în fereastra de Inspector.

Apoi, avem nevoie pentru a redimensiona JPanel pentru a face loc pentru componentele vom loc în ea un pic mai târziu, dar hai sa ia un minut să subliniez un alt de vizualizare Generatorul GUI lui caracteristici prima. În scopul de a face acest lucru avem nevoie pentru a deselecta JPanel tocmai le-am adăugat. Pentru ca nu am adăugat un titlu de frontieră încă, panoul dispare. Remarca, totuşi, că, atunci când treci cursorul peste JPanel, marginile sale schimbare la lumina gri, astfel încât poziţia sa poate fi văzut în mod clar. Ai nevoie doar să faceţi clic oriunde în cadrul componentei selectaţi din nou aceasta şi provoacă redimensionare mânere şi ancorarea indicatori care să reapară.

Pentru a redimensiona JPanel: 1.

Selectaţi JPanel tocmai l-aţi adăugat. De redimensionare mic patrat mânere reapare în jurul perimetrului componenta a lui.

2.

Faceţi clic şi ţineţi redimensiona mâner pe marginea din dreapta a JPanel şi trageţi până la orientarea alinierea punctate apare apropiere de marginea formular.

24

3.

De presă al redimensiona mânerul pentru a redimensiona componenta. Componenta JPanel este extins la durata între marjele de containerului stânga şi dreapta, în conformitate cu recomandate offset, aşa cum se arată în ilustraţia următoare.

Acum, că am adăugat un panou să conţină informaţii nostru Numele UI lui, avem nevoie să repetaţi procesul pentru a adăuga un alt mod direct de mai jos prima pentru e-mail de informare. Referindu-se la următoarele ilustraţii, se repetă anterioare două sarcini, acordând o atenţie pentru a poziţionare Generatorul GUI's sugerat. Observaţi că distanţa a sugerat verticală între JPanels doi este mult mai restrâns decât că, la margini. După ce aţi adăugat JPanel al doilea, redimensionati-o astfel încât să umple rămase sub formă de spaţiu pe verticală.

25

26

Pentru că vrem să se facă distincţia vizual funcţii în superioare şi inferioare ale GUI secţiunile noastre, avem nevoie pentru a adăuga un titlu de frontieră şi pentru fiecare JPanel. În primul rând vom realiza acest lucru, folosind fereastra de Proprietăţi, apoi vom încerca le folosind meniul pop-up.

Pentru a adăuga frontierele titlul de proprietate asupra JPanels: 1.

Selectaţi JPanel de top în Builder GUI.

2.

În fereastra de Proprietăţi, faceţi clic pe butonul elipsă (...) lângă proprietatea de frontieră.

3.

In frontieră JPanel editorul care apare, selectaţi nodul TitledBorder în panoul disponibile Borders.

4.

În panoul Proprietăţi de mai jos, introduceţi numele pentru titlul de proprietate.

5.

Faceţi clic pe elipsa (...) lângă proprietatea Font, Bold selectaţi pentru stilul de font, şi introduceţi 12 pentru Dimensiune. Faceţi clic pe OK pentru a ieşi din dialog.

6.

Selectaţi în partea de jos JPanel şi repetaţi paşii 2 până la 5, dar de data aceasta faceţi clic dreapta pe JPanel şi accesul Properties fereastră cu ajutorul meniul pop-up. Adresa de e-mail pentru titlul de proprietate. Frontierele Intitulat, se adaugă la ambele componente JPanel.

Adăugarea de Componente separate la formularul Acum, avem nevoie să adăugaţi componente care va prezenta informatii reale de contact în lista noastre de contact. În cadrul acestei responsabilităţi vom adăuga patru JTextFields că va afişa informaţiile de contact şi a JLabels care vor să le descrieţi. În timp ce realizarea acestui, observaţi liniile directoare orizontale şi verticale care afişează GUI Builder, sugerând componenta preferat spaţiere astfel cum sunt definite de către dvs. sistemului de operare uite si sa se simta. Acest lucru asigură faptul că GUI-ul este în mod automat făcut respectând obiectivul sistemului de operare privim si sa se simta la rulare.

Pentru a adăuga un JLabel la formularul de: 1. 2.

În fereastra Palette, selectaţi componenta etichetă din categoria Swing. Mutaţi cursorul peste Numele JPanel am adaugat mai devreme. În cazul în care apar linii directoare care să indice că JLabel este poziţionat în colţul din stânga sus al JPanel cu o marjă mică la marginile de sus şi din stânga, faceţi clic pentru a plasa etichetă. The JLabel se adaugă la forma şi un nod corespunzător, reprezentând componenta se adaugă la fereastra Inspector.

Inainte de a merge mai departe, avem nevoie pentru a edita textul de afişare a JLabel tocmai le-am adăugat. Deşi aveţi posibilitatea să editaţi componenta textul afişat în orice moment, cea mai uşoară cale este de a face acest lucru ca le adăugaţi.

Pentru a edita textul de afişare a unei JLabel: 1.

Faceţi dublu clic pe JLabel pentru a selecta textul ei de afişare.

2.

Numele primul tip: si apasati Enter. Numele JLabel e nou este afişat şi lăţime componente reglează, ca urmare a edita.

Acum, vom adăuga o JTextField astfel încât să putem obţine o bucatica din caracteristică Builder GUI de valoarea iniţială de aliniere.

27

Pentru a adăuga un JTextField la formularul de: 1. 2.

În fereastra Palette, selectaţi textul Câmp componenta din categoria Swing. Mutaţi cursorul imediat de la dreptul de prenume: JLabel ne-am adăugat. Când orientarea orizontală pare să indice că iniţială a JTextField este aliniat cu cea a JLabel şi spaţierea între cele două componente este sugerat, cu o orientare verticală, faceţi clic pe la poziţia JTextField. JTextField fixează în poziţie în formularul de aliniat cu valoarea iniţială JLabel lui, aşa cum se arată în ilustraţia următoare. Observaţi că JLabel mutat în jos, uşor în vederea alinierii cu valoarea iniţială mai înalt câmpul de text a lui. Ca de obicei, un nod reprezentând componenta se adaugă la fereastra Inspector.

Înainte de a trece mai departe, avem nevoie pentru a adăuga un JLabel suplimentare şi JTextField imediat la dreapta, ale celor tocmai le-am adăugat, după cum se arată în ilustraţia următoare. De această dată intră Last Name: ca JLabel a textului de afişare şi se lasă de text JTextFields "substituent aşa cum este pentru acum.

Pentru a redimensiona un JTextField: 1.

Selectaţi JTextField tocmai le-am adăugat la dreapta a Last Name: JLabel.

2.

Glisaţi marginea JTextField dreptul redimensiona mânerul spre marginea din dreapta a anexând JPanel.

3.

În cazul în care liniile directoare verticale alinierea apar sugerând marja dintre câmpul de text şi marginea din dreapta a JPanel, eliberaţi butonul mouse-ului pentru a redimensiona JTextField. Marginea JTextField dreptul fixează alinierea cu marja de JPanel's Edge a recomandat, aşa cum se arată în ilustraţia următoare.

28

Adăugarea de multiple Componente la formularul Acum, vom adăuga Titlu: şi Nick: JLabels care descriu două JTextFields că vom adăuga într-un minut. Vom alege şi de plop componentelor în timp ce apăsaţi tasta Shift, pentru a le adăuga rapid la forma. Realizarea acestui În timp ce, din nou, observaţi că Builder GUI afişează liniile orizontale si verticale care sugerează spaţierea preferat componenta.

Pentru a adăuga JLabels multiple pentru a forma: 1.

În fereastra Palette, selectaţi componenta etichetă din categoria Swing, făcând clic pe şi de eliberare a butonul mouse-ului.

2.

Mutaţi cursorul peste formularul de mai jos, direct prenume: JLabel am adaugat mai devreme. În cazul în care liniile directoare par să indice că marginea JLabel noului stânga este aliniat cu cel al JLabel de mai sus şi o marjă mică există între ele, Shiftclick pentru a JLabel primul loc.

3.

În timp ce încă mai apăsând tasta Shift, faceţi clic pe un alt loc pentru a JLabel imediat la dreapta din prima. A face anumite pentru a elibera tasta Shift înainte to poziţionarea JLabel al doilea. Dacă uitaţi să eliberaţi tasta Shift to înainte de poziţionare JLabel ultima, pur şi simplu apăsaţi tasta Escape. The JLabels se adaugă la formularul de crearea unui al doilea rând, aşa cum se arată în ilustraţia următoare. Nodurile reprezentând fiecare componentă se adaugă la fereastra Inspector.

Înainte de a trece mai departe, avem nevoie pentru a edita numele JLabels ", astfel că vom putea vedea efectul aliniamente vom stabili mai târziu.

Pentru a edita textul de afişare a JLabels: 1.

Faceţi dublu clic pe JLabel prima pentru a selecta textul ei de afişare.

2.

Titlu Tip: si apasati Enter.

3.

Repetaţi paşii 1 şi 2, care intră Nickname: pentru proprietatea numele JLabel-al doilea.

29

Numele JLabels "noi sunt afişate în forma şi sunt deplasate ca urmare a lăţimi lor editate, după cum se arată în ilustraţia următoare.

Introducerea Componente Adesea, este necesar să se adauge o componentă între componente care sunt deja plasate într-un formular. Ori de câte ori când adăugaţi o componentă între două componente existente, Generatorul GUI automat ture-le pentru a face loc pentru noi componente. Pentru a demonstra acest lucru, vom introduce un JTextField între JLabels am adăugat anterior, aşa cum se arată în următoarele două ilustraţii.

Pentru a insera un JTextField între două JLabels: 1. 2.

3.

În fereastra Palette, selectaţi textul Câmp componenta din categoria Swing. Mutaţi cursorul peste Titlu: şi Nick: JLabels de pe rândul al doilea, astfel încât JTextField suprapunerile, cât şi este aliniat la liniile de bază ale acestora. Dacă întâmpinaţi dificultăţi de poziţionare noul câmp de text, aveţi posibilitatea să fixaţi-l la orientarea stânga JLabel Pseudonim aşa cum se arată în prima imagine de mai jos. Faceţi clic pentru a plasa JTextField între Titlu: şi Nick: JLabels. JTextField fixează în poziţie între cele două JLabels. Schimbările din extrema dreaptă JLabel spre dreapta a JTextField pentru a veni în sugerat orizontale de offset.

30

Avem încă mai trebuie să adăugaţi un JTextField suplimentare pentru a forma în care se va afişa porecla fiecare contact pe partea dreapta a formularului.

Pentru a adăuga un JTextField: 1. 2.

În fereastra Palette, selectaţi textul Câmp componenta din categoria Swing. Mutaţi cursorul în partea dreaptă a etichetei Nickname şi faceţi clic pe la locul câmpul de text. The JTextField fixează în poziţie de lângă JLabel în stânga acestuia.

Pentru a redimensiona un JTextField: 1.

Glisaţi redimensionare mânerele de la Nick: JTextField etichetei le-aţi adăugat în sarcina anterior spre dreapta a anexând JPanel.

2.

În cazul în care liniile directoare verticale alinierea apar sugerând marja dintre câmpul de text şi marginile JPanel, eliberaţi butonul mouse-ului pentru a redimensiona JTextField. Marginea JTextField dreptul fixează alinierea cu marja de JPanel's Edge recomandate şi Builder GUI conchide comportament adecvat redimensionare.

Moving Forward Alinierea este unul dintre aspectele cele mai fundamentale de a crea profesional-GUIs caută. În secţiunea precedentă am luat o bucatica de caracteristici alinierea IDE lui în timp ce adăugând JLabel şi a componentelor JTextField la formularul nostru de ContactEditorUI. Apoi, vom arunca o privire mai în adâncimea la caracteristicile de aliniere Generatorul GUI ca lucram cu diferitele componente cu alte avem nevoie pentru a aplicaţiei noastre.

Componenta Aliniere De fiecare dată când adăugaţi un element la un formular, Builder GUI în mod eficient aliniază-le, aşa cum rezultă din liniile directoare de aliniere care apar. Uneori este necesar, cu toate acestea, pentru a specifica relaţii diferite între grupuri de componente, de asemenea. Mai devreme am adaugat patru JLabels de care avem nevoie pentru GUI ContactEditor noastre, dar am făcut, nu le-a alinia. Acum vom alinia două coloane ale JLabels, astfel încât marginile lor dreptul de linia de sus.

Pentru alinierea componente: 1. 2.

3.

Selectaţi Primul nume: şi în titlul: JLabels pe partea stângă a formularului. ), În bara de instrumente. Faceţi clic pe dreapta alinia, în coloana buton ( Alternativ, aveţi posibilitatea să faceţi clic dreapta fie una, şi alege Aliniaţi> dreapta în coloana din meniul pop-up. Repetaţi acest lucru pentru Last Name: şi Nick: JLabels, de asemenea. Poziţiile JLabels "schimbare, astfel încât marginile dreptul de a textului de afişare a acestora sunt aliniate. Relaţiile de ancorare sunt actualizate, indicând faptul că componentele au fost grupate.

Înainte de a terminat cu JTextFields am adaugat mai devreme, avem nevoie să vă asiguraţi că JTextFields doi vom introduce între JLabels sunt setate pentru a redimensiona în mod corect. Spre

31

deosebire de JTextFields doi că am întins la marginea din dreapta a formularul nostru, introdus comportamentul componentelor "resizeability nu este setat automat.

Pentru a seta componenta comportament resizeability: 1.

Control-clic pe cele două componente introduce JTextField pentru a selecta lor în Builder GUI.

2.

Cu atât JTextFields selectat, faceţi clic dreapta pe nici unul dintre ele şi a alege Auto Redimensionarea> orizontale din meniul pop-up. JTextFields sunt stabilite pentru a redimensiona orizontal la rulare. Liniile directoare aliniere şi indicatorii de ancorare sunt actualizate, furnizarea de feedback vizual al relaţiilor componente.

Pentru a seta componente care urmează să fie de aceeaşi dimensiune: 1. 2.

Control-clic pe toate cele patru JTextFields în forma de a le selecta. Cu JTextFields selectată, faceţi clic dreapta pe oricare dintre ele şi să alegeţi Set dimensiunea implicită din meniul pop-up. The JTextFields sunt toate setate la aceeaşi lăţime şi indicatorii se adaugă la marginea de sus a fiecărei, furnizarea de feedback vizual al relaţiilor componente.

Acum, avem nevoie pentru a adăuga un alt JLabel descrie JComboBox care va permite utilizatorilor să selecteze formatul de informare a aplicaţiei noastre ContactEditor vor fi afişate.

Pentru a alinia o JLabel la un grup de componente: 1. 2.

În fereastra Palette, selectaţi componenta etichetă din categoria Swing. Mutaţi cursorul de mai jos prenumele şi JLabels titlul de pe partea stângă a JPanel. În cazul în care orientarea pare să indice că marginea JLabel noului dreapta este aliniat cu marginile din dreapta a grupului de componente de mai sus (cele două JLabels), faceţi clic pentru a poziţia componenta. The JLabel fixează într-un drept aliniat la poziţia cu coloana de JLabels de mai sus, aşa cum se arată în ilustraţia următoare. GUI actualizează Builder liniile de alinierea statutului indicând componente spaţierea, precum şi ancorarea relaţii.

Ca şi în exemplele anterioare, faceţi dublu clic pe JLabel pentru a selecta textul ei de afişare şi apoi introduceţi Display Format: pentru numele afişat. Observaţi că atunci când JLabel fixează în poziţie, celelalte componente pentru a permite trecerea de text mai lung de afişare.

Alinierea la momentul iniţial Ori de câte ori le adăugaţi sau să mutaţi componente care include un text (JLabels, JTextFields, şi aşa mai departe), IDE sugerează aliniamente care se bazează pe liniile de bază ale textului în componente.

32

Când am introdus JTextField mai devreme, de exemplu, iniţial sa a fost în mod automat aliniate la JLabels adiacente. Acum, vom adăuga caseta combo care va permite utilizatorilor să selecteze formatul de informaţii pe care a aplicaţiei noastre ContactEditor vor fi afişate. Aşa cum am adăuga JComboBox, vom alinia de bază sale cu cea a textului JLabel lui. Comunicarea, din nou, liniile directoare de bază de aliniere care par a ne ajuta cu poziţionare.

Pentru a alinia la liniile de bază de componente: 1. 2.

În fereastra Palette, selectaţi Combo Box componenta din categoria Swing. Mutaţi cursorul imediat de la dreptul de JLabel tocmai le-am adăugat. Când orientarea orizontală pare să indice că valoarea iniţială JComboBox este aliniat cu linia de bază a textului în JLabel şi distanţa dintre cele două componente este sugerat, cu o orientare verticală, faceţi clic pe la poziţia caseta combo. Componenta fixează într-o poziţie aliniat cu valoarea iniţială a textului în JLabel la stânga acestuia, după cum se arată în ilustraţia următoare. Generatorul GUI afişează liniile care indică statutul de componente spaţierea, precum şi ancorarea relaţii.

Pentru a redimensiona JComboBox: 1. 2.

Selectaţi ComboBox în Builder GUI. Glisaţi redimensionare mâner pe marginea JComboBox dreptul spre dreapta, până la liniile directoare de aliniere apare sugerând preferat compensa între JComboBox şi margini JPanel. Aşa cum se arată în ilustraţia următoare, marginea JComboBox dreptul fixează alinierea cu marja de JPanel's Edge recomandate şi lăţimea componenta este setată automat pentru a redimensiona cu formularul.

Modele de editare componenta este dincolo de domeniul de aplicare a acestui tutorial, asa ca, pentru

Trecerea în revistă a ceea ce am învăţat

33

Am ajuns un start bun clădire GUI noastre ContactEditor, dar hai sa iei câteva minute pentru recapitulare ceea ce am învăţat în timp ce vom adăuga câteva mai multe dintre componentele interfata noastra cere. Până acum ne-am concentrat pe adăugarea de componente pentru a GUI noastre ContactEditor folosind liniile directoare alinierea IDE de a ne ajuta cu poziţionare. Este important să se înţeleagă, totuşi, că o altă parte integrantă din plasarea componentei este de ancorare. Deşi nu am discutat-o inca, v-aţi luat deja profita de această facilitate fără să o ştie. După cum sa menţionat anterior, ori de câte ori când adăugaţi un element la un formular, IDE sugerează aspectul ţintă şi de poziţionare simt lui preferat cu liniile directoare. Odată plasate, componente noi sunt, de asemenea, ancorate la cel mai apropiat de margine de container sau componente pentru a se asigura că relaţiile componente sunt menţinute în timpul rulării. În această secţiune, vom concentra pe realizarea sarcinilor într-un mod mai simplificat subliniind totodată activitatea constructorul GUI este de a face în spatele scenei.

Adăugarea, Alinierea, precum şi ancorarea Generatorul GUI vă permite să se stabilească formularele rapid şi uşor prin raţionalizarea gesturi de flux de lucru tipic. Ori de câte ori să adăugaţi un element la un formular, Builder GUI automat fixează-le în poziţiile preferate şi stabileşte relaţiile necesare înlănţuirea astfel încât vă puteţi concentra pe proiectarea forme, mai degrabă decât lupta cu detaliile de implementare complicate.

Pentru a adăuga, pentru a alinia, şi să editaţi textul de afişare a unei JLabel: 1.

În fereastra Palette, selectaţi componenta etichetă din categoria Swing.

2.

Mutaţi cursorul peste formularul de mai jos imediat E, cu JPanel partea de jos a lui titlu-mail. În cazul în care liniile directoare par să indice că este poziţionat în colţul din stânga sus al JPanel cu o marjă mică la marginile de sus şi din stânga, faceţi clic pe la locul JLabel.

3.

Faceţi dublu clic pe JLabel pentru a selecta textul ei de afişare. Apoi, de tip E-mail: si apasati Enter. JLabel fixează în poziţia preferată în formă, ancorat la marginile de sus şi din stânga a anexând JPanel. La fel ca înainte, un nod corespunzător reprezentând componenta se adaugă la fereastra Inspector.

Pentru a adăuga un JTextField: 1. 2.

3.

În fereastra Palette, selectaţi textul Câmp componenta din categoria Swing. Mutaţi cursorul imediat de la dreptul de Adresa E-mail etichetă ne-am adăugat. În cazul în care liniile directoare par să indice că valoarea iniţială JTextField este aliniat cu linia de bază a textului în JLabel şi a marjei dintre cele două componente este sugerat, cu o orientare verticală, faceţi clic pentru a poziţia câmpul de text. The JTextField fixează în poziţie cu privire la dreptul de E-mail Adresa: JLabel şi este legat la JLabel. Nod sale corespunzătoare este, de asemenea, adaugă la fereastra Inspector. Glisaţi redimensionare mânerul JTextField spre dreapta a anexând JPanel până la liniile directoare de aliniere apare sugerând compensa între JTextField şi margini JPanel. Marginea JTextField dreptul fixează la orientarea alinierea indicând marjele de preferat.

Acum, avem nevoie pentru a adăuga JList care va afişa întregul ContactEditor noastre lista de contacte.

34

Pentru a adăuga şi a redimensiona o JList: 1.

În fereastra Palette, selectaţi componenta Lista din categoria Swing.

2.

Mutaţi cursorul imediat de mai jos e-mail Adresa JLabel am adaugat mai devreme. În cazul în care liniile directoare par să indice că marginile JList lui de sus şi din stânga sunt aliniate cu marjele de preferat de-a lungul marginii JPanel de stânga şi JLabel de mai sus, faceţi clic pentru poziţia JList.

3.

Glisaţi JList a redimensiona la mâner dreapta spre dreapta a anexând JPanel până la liniile directoare de aliniere par să indice că este aceeaşi lăţime ca şi JTextField de mai sus. JList fixează în poziţia desemnat de către liniile directoare aliniere şi nodul sale corespunzătoare este afişat în fereastra de Inspector. Comunicarea, de asemenea, că forma extinde pentru a acomoda JList nou adăugat.

Din moment ce JLists sunt utilizate pentru a afişa liste lungi de date, au de obicei nevoie de adăugarea unui JScrollPane. Ori de câte ori când adăugaţi o componentă care necesită o JScrollPane, Builder GUI adaugă automat pentru tine. Deoarece JScrollPanes sunt componente non-vizuale, trebuie să se folosească de Inspector în scopul de a vizualiza sau edita orice JScrollPanes că Builder GUI creat.

Componenta de calibrare Acesta este adesea benefic pentru a stabili mai multe componente conexe, cum ar fi butoane în dialogurile modale, care urmează să fie de aceeaşi dimensiune pentru consistenţă vizuale. Pentru a demonstra acest pas vom adăuga patru JButtons pentru a forma ContactEditor nostru care ne va permite să adăugaţi, să editaţi şi elimina intrările individuale din lista noastre de contact, aşa cum se arată în următoarele ilustraţii. Apoi, vom stabili cele patru butoane care urmează să fie de aceeaşi dimensiune astfel încât acestea să poată fi uşor recunoscut ca oferind funcţionalitate conexe.

Pentru a adăuga, pentru a alinia, şi să editaţi textul afişat de butoane multiple: 1.

În fereastra Palette, selectaţi componenta Button.

2.

Mutaţi JButton peste marginea din dreapta a e-mail Adresa JTextField în JPanel mai mici. În cazul în care liniile directoare par să indice că iniţială a JButton şi marginea din dreapta sunt aliniate cu cea a JTextField, Shift-click pentru a loc primul buton de-a lungul marginea JFrame dreptul. Lăţimea JTextField a diminuării populaţiei active pentru a veni în JButton atunci când eliberaţi butonul mouse-ului.

3.

Mutaţi cursorul peste colţul din dreapta sus a JList în JPanel mai mici. În cazul în care liniile directoare par să indice că marginile JButton lui de sus şi dreapta sunt aliniate cu cea a JList, Shift-Click pentru locul al doilea buton de-a lungul marginii JFrame dreptul.

4.

Adăugaţi două JButtons suplimentare de mai jos cele două pe care deja am adăugat pentru a crea o coloană. A face anumite poziţia JButtons, astfel încât distanţa între sugerat este respectat şi coerente. If you forget to release the Shift key prior to positioning the last JButton, simply press the Escape key.

5.

Set the display text for each JButton. (You can edit a button's text by right-clicking the button and choosing Edit Text. Or you can click the button, pause, and then click again.) Enter Add for the top button, Edit for the second, Remove for the third, and As Default for the fourth. The JButton components snap into the positions designated by the alignment guidelines. The width of the buttons changes to accommodate the new names.

35

Now that the buttons are positioned where we want them, we'll set the four buttons to be the same size for visual consistency as well as to clarify that they are related functionally.

To set components to the same size: 1.

Select all four JButtons by pressing the Control key while making your selection.

2.

Right-click one of them and choose Same Size > Same Width from the pop-up menu. The JButtons are set to the same size as the button with the longest name.

Indentation Often it is necessary to cluster multiple components under another component such that it is clear they belong to a group of related functions. One typical case, for example, is placing several related checkboxes below a common label. The GUI Builder enables you to accomplish indenting easily by providing special guidelines suggesting the preferred offset for your operating system's look and feel. In this section we'll add a few JRadioButtons below a JLabel that will allow users to customize the way the application displays data. Refer to the following illustrations while accomplishing this or click the View Demo link following the procedure to view an interactive demonstration.

To indent JRadioButtons below a JLabel: 1.

Add a JLabel named Mail Format to the form below the JList. Make certain the label

36

is left aligned with the JList above. 2.

In the Palette window, select the Radio Button component from the Swing category.

3.

Move the cursor below the JLabel that we just added. When the guidelines appear indicating that the JRadioButton's left edge is aligned with that of the JLabel, move the JRadioButton slightly to the right until secondary indentation guidelines appear. Shiftclick to place the first radio button.

4.

Move the cursor to the right of the first JRadioButton. Shift-click to place the second and third JRadioButtons, being careful to respect the suggested component spacing. Make certain to release the Shift key prior to positioning the last JRadioButton.

5.

Set the display text for each JRadioButton. (You can edit a button's text by rightclicking the button and choosing Edit Text. Or you can click the button, pause, and then click again.) Enter HTML for the left radio button, Plain Text for the second, and Custom for the third. Three JRadioButtons are added to the form and indented below the Mail Format JLabel.

Now we need to add the three JRadioButtons to a ButtonGroup to enable the expected toggle behavior in which only one radio button can be selected at a time. This will, in turn, ensure that our ContactEditor application's contact information will be displayed in the mail format of our choosing.

37

To add JRadioButtons to a ButtonGroup: 1.

In the Palette window, select the Button Group component from the Swing category.

2.

Click anywhere in the GUI Builder design area to add the ButtonGroup component to the form. Notice that the ButtonGroup does not appear in the form itself, however, it is visible in the Inspector's Other Components area.

3.

Select all three of the JRadioButtons in the form.

4.

In the Properties window, choose buttonGroup1 from the buttonGroup property combo box. Three JRadioButtons are added to the button group.

Making the Final Adjustments We've managed to rough out our ContactEditor application's GUI, but there are still a few things remaining to do. In this section, we'll take a look at a couple of other typical layout tasks that the GUI Builder streamlines.

De finisare Up Now we need to add the buttons that will enable users to confirm the information they enter for an individual contact and add it to the contact list or cancel, leaving the database unchanged. In this step, we'll add the two required buttons and then edit them so that they appear the same size in our form even though their display text are different lengths.

To add and edit the display text of buttons: 1.

If the lower JPanel is extended to the bottom edge of the JFrame form, drag the bottom edge of the JFrame down. This gives you space between the edge of the JFrame and the edge of the JPanel for your OK and Cancel buttons.

2.

In the Palette window, select the Button component from the Swing category.

3.

Move the cursor over the form below the E-mail JPanel. When the guidelines appear indicating that the JButton's right edge is aligned with the lower right corner of the JFrame, click to place the button.

4.

Add another JButton to the left of the first, making certain to place it using the suggested spacing along the JFrame's bottom edge.

5.

Set the display text for each JButton. Enter OK for the left button and Cancel for right one. Notice that the width of the buttons changes to accommodate the new names.

6.

Set the two JButtons to be the same size by selecting both, right-clicking either, and choosing Same Size > Same Width from the pop-up menu. The JButton components appear in the form and their corresponding nodes are displayed in the Inspector window. The JButton components' code is also added to the form's source file which is visible in the Editor's Source view. Each of the JButtons are set to the same size as the button with the longest name.

The last thing we need to do is delete the placeholder text in the various components. Note that while removing placeholder text after roughing out a form can be a helpful technique in avoiding problems with component alignments and anchoring relationships, most developers typically remove this text in the process of laying out their forms. As you go through the form, select and delete the placeholder text for each of the JTextFields. We'll leave the placeholder items in both the JComboBox and JList for a later tutorial.

38

Previewing Your GUI Now that you have successfully built the ContactEditor GUI, you can try your interface to see the results. You can preview your form as you work by clicking the Preview Form button (

) in the GUI Builder's

toolbar. The form opens in its own window, allowing you to test it prior to building and running.

Deploying GUI Applications In order for the interfaces you create with the GUI Builder to work outside of the IDE, the application must be compiled against classes for the GroupLayout layout manager and also have those classes available at runtime. These classes are included in Java SE 6, but not in Java SE 5. If you develop the application to run on Java SE 5, your application needs to use the Swing Layout Extensions library. If you are running the IDE on JDK 5, the IDE automatically generates your application code to use the Swing Layout Extensions library. When you deploy the application, you need to include the Swing Layout Extensions library with the application. When you build the application (Build > Build Main Project), the IDE automatically provides a copy of the library's JAR file in the application's dist/lib folder. The IDE also adds each of the JAR files that are in the dist/lib folder to the Class-Path element in the application JAR file's manifest.mf file.

If you are running the IDE on JDK 6, the IDE generates your application code to use the GroupLayout classes that are in Java SE 6. This means that you can deploy the application to 39

run on systems with Java SE 6 installed and you do not need to package your application with the Swing Layout Extensions library. Note: If you create your application using JDK 6 but you need the application to also run on Java SE 5, you can have the IDE generate its code to use the Swing Layout Extensions library instead of the classes in Java SE 6. Open the ContactEditorUI class in the GUI Editor. In the Inspector, expand the ContactEditorUI node and choose Form ContactEditorUI. In the Properties window, change the value of the Layout Generation Style property to Swing Layout Extensions Library. Distributing and Running Standalone GUI Applications To prepare your GUI application for distribution outside of the IDE: Zip the project's dist folder into a ZIP archive. (The dist folder might also contain a lib



folder, which you would also need to include.) To run a standalone GUI application from the command line: 1.

Navigate to the project's dist folder.

2.

Type the following:

java -jar <jar_name>.jar Note: If you encounter the following error:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jdesktop/layout/GroupLayout$Group Ensure that the manifest.mf file references the currently installed version of the Swing Layout Extensions Library.

40

Modulu IV Componentele Swing Swing este un subset JFC (Java Foundation Classes) şi constă dintr-o serie de componente vizuale care extind (îmbunătăţesc) componentele AWT, şi furnizează noi facilităţi precum tabele şi arbori. Structura de clase din Swing este asemănătoare cu cea din AWT, în sensul că toate componentele interfeţei grafice sunt derivate dintr-un singur părinte numit JComponent (care este derivat din clasa AWT Container). Pachetul de clase Swing reprezintă soluţia furnizată de Sun pentru crearea unor interfeţe utilizator grafice complet portabile pe orice platformă. În Swing, toate numele claselor încep cu litera J, şi atunci când este posibil, numele este acelaşi cu cel al clasei AWT pe care o înlocuieşte. La fel ca la AWT, punctul de plecare pentru un program bazat pe Swing, este clasa JFrame sau clasa JApplet. Principalele componentele Swing definite in pachetul javax.swing.*; Componente atomice JLabel, JButton, JCheckBox, JRadioButton, JToggleButton, JScrollBar, JSlider, JProgressBar, JSeparator Componente complexe JTable, JTree, JComboBox, JSpinner, JList, JFileChooser, ColorChooser, JOptionPane Componente pentru editare de text JTextField, JFormattedTextField, JPasswordField, JTextArea, JEditorPane, JTextPane Meniuri JMenuBar, JMenu, JPopupMenu, JMenuItem, JCheckboxMenuItem, JRadioButtonMenuItem Containere intermediare JPanel, JScrollPane, JSplitPane, JTabbedPane, JDesktopPane, JToolBar Containere de nivel ınalt JFrame, JDialog, JWindow, JInternalFrame, JApplet 41

Oricarei aplicatii grafice ii corespunde o fereastra principala (de tip FRAME) si una sau mai multe ferestre aditionale. In swing exista trei clase pentru gestionarea ferestrelor care sunt: • Jframe, • JWindow • JDialog. Clasa JFrame permite crearea unei ferestre de aplicatie. Fereastra are o bara de titlu, o margine, butoane de minimizare, maximizare si inchidere (butoane "system"). Clasa JWindow permite crearea unei ferestre fara bara de titlu, meniu, butoane sistem etc. Clasa JDialog permite crearea de ferestre de dialog. Ferestrele de dialog sunt dependente de ferestrele parinte de tip Frame. O fereastra de dialog poate fi modala (blocheaza aplicatia pana la inchiderea dialogului) sau nemodala (nu blocheaza). Pentru a crea ferestre de afisare a unor mesaje se poate utiliza direct o functie statica, fara a mai crea explicit un obiect tip dialog: Crearea unei ferestre principale: public static void main(String args[]) { JFrame nume_fereastra = new JFrame(“Student la facultatea"); nume_fereastra.setSize(200, 200); nume_fereastra.show(); } Observatie: Pentru a accesa continutul unei ferestre se va folosi functia getContentPanel(): Container c = nume_fereastra.getContentPane(); Închiderea automata a aplicatiei când se apasă butonul Close, se realizează utilizând metoda serDefaultCloseOperation astfel: setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Pentru oganizarea elementelor într-o fereastra se vor folosesc panouri din swing ca: JPanel (simple) si JScrollPane (cu bare de derulare). APLICAŢIE

42

import javax.swing.*; import java.awt.*; class Aplic { public static void main(String args[]) { JFrame win = new JFrame("Aplicatia mea"); win.getContentPane().add( new JLabel("Utilizare swing!")); win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); win.pack(); win.show(); } } Butoane Butoanele sunt elemente de control care, prin apasare, pot genera o actiune. Butoanele deriva din clasa JButton. In costructor primesc textul afisat pe buton. Prin metoda setMnemonic se pot asocia taste de apelare rapida (shortcut). Pentru a adauga un cuvant de comanda asociat butonului (cuvant ce va fi testat pentru efectuarea actiunii asociate) se foloseste metoda addActionCommand(). Exemplu de definire a unui buton JButton buton = new JButton("BUTON SWING!"); buton.setMnemonic('i'); buton.addActionCommand("butonulSwing"); // adaugarea unui buton pe o suprafata JPanel panouButon = new JPanel(); panouButon.add(buton); CheckBox Butoanele de marcaj sunt elemente de control care retin o anumita stare. In plus fata de butoanele simple, pentru ele se pot apela metodele setSelected (boolen marcat) pentru a stabili marcajul prin program, respectiv getSelected() pentru a testa starea marcajului. cb1 = new JCheckBox(“Optiune1"); cb1.setSelected(true); JPanel checkPanel = new JPanel(); checkPanel.setLayout(new GridLayout(0, 1)); //GridLayout Aşează componentele într-un grid bidimensional. 43

checkPanel.add(cb1); RadioButton Butoanele radio sunt elemente de control care retin o anumita stare, la fel cu cele de marcaj. Deosebirea principala consta in faptul ca toate butoanele radio incluse in acelasi grup logic sunt mutual exclusive. Pentru gestionarea grupurilor de butoane radio se va folosi clasa ButtonGroup, respectiv metoda add() care adauga un buton la grup. Si pentru butoanele radio se pot apela metodele setSelected(boolen marcat) pentru a stabili marcajul prin program, respectiv getSelected() pentru a afla starea marcajului. // creare buton radio JRadioButton primulbuton = new JRadioButton(“BUTON 1”); primulbuton setActionCommand(“BUTON 1”); primulbuton.setSelected(true); JradioButton alt_doilea_buton = new JRadioButton(“BUTON 2”); alt_doilea_buton.setActionCommand(“BOTON 2”); … // definirea unui grup de butoane ButtonGroup grupbutoane = new ButtonGroup(); gropbutoane.add(primulbuton); gropbutoane.add(alt_doilea_buton); … // adaugarea butoanelor radio pe o suprafata Jpanel JPanel radioPanel = new JPanel(); radioPanel.setLayout(new GridLayout(0, 1)); radioPanel.add(primulbuton); radioPanel.add(alt_doilea_buton); APLICAŢIE import javax.swing.*; import java.awt.*; import java.awt.event.*; class Butoane extends JPanel { public Butoane() { JButton b1 = new JButton("ButonA"); JButton b2 = new JButton("ButonB"); this.setLayout(new GridLayout(1,0)); add(b1); add(b2); 44

} } class CheckBoxuri extends JPanel { public CheckBoxuri() { JCheckBox cb1 = new JCheckBox("Optiune1"); cb1.setSelected(true); JCheckBox cb2 = new JCheckBox("Optiune2"); cb2.setSelected(true); JCheckBox cb3 = new JCheckBox("Optiune3"); cb3.setSelected(true); this.setLayout(new GridLayout(0,1)); add(cb1); add(cb2); add(cb3); } } class ButoaneRadio extends JPanel { public ButoaneRadio() { // Creare radio butoane JRadioButton butonAlb = new JRadioButton("Alb"); butonAlb.setActionCommand("Alb"); butonAlb.setSelected(true); JRadioButton butonRosu = new JRadioButton("Rosu"); butonRosu.setActionCommand("Rosu"); JRadioButton butonVerde = new JRadioButton("Verde"); butonVerde.setActionCommand("Verde"); // Gruparea butoanelor ButtonGroup group = new ButtonGroup(); group.add(butonAlb); group.add(butonRosu); group.add(butonVerde); // Adaugarea butoanelor this.setLayout(new GridLayout(0,1)); add(butonAlb); add(butonRosu); add(butonVerde); } } public class Desen_aplicatie extends JFrame { public static void main(String args[]) { Desen_aplicatie app = new Desen_aplicatie(); 45

Butoane panouButoane = new Butoane(); CheckBoxuri panouCheckBoxuri = new CheckBoxuri(); ButoaneRadio panouButoaneRadio = new ButoaneRadio(); JPanel panou = new JPanel(); panou.setLayout(new GridLayout(0,1)); panou.add(panouButoane); panou.add(panouCheckBoxuri); panou.add(panouButoaneRadio); panou.setBorder( BorderFactory.createEmptyBorder(20, 20, 20, 20)); app.getContentPane().add(panou); app.pack(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); app.show(); } }

ListBox ListBox-urile afiseaza liste de optiuni. Ele se compun dintr-un element care se ocupa de vizualizare (derivat din clasa JList), respectiv dintr-un element care se ocupa cu gestionarea continutului (derivat din ListModel). Interfata ListModel pune la dispozitie o metoda addElement() care permite adaugarea unei noi optiuni in lista. Constructorul clasei JList primeste un obiect de tip ListModel pe care il va afisa pe ecran. Pentru a avea la dispozitie bare de derulare asociate listei, aceasta va trebui inclusa intr-un element de tip JScrollPane (un panou derulant). 46

Aditional listelor simple se pot defini si liste cu derulare (de tip ComboBox). Acestea afiseaza in mod obisnuit o singura optiune din lista iar pentru a accesa restul optinulor lista trebuie derulata de la un buton special. Listele derulante nu trebuie sa fie adaugate intr-un JScrollPane. ListModel listModel = new DefaultListModel(); listModel.addElement(“Linie1"); … JList list = new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // pentru selectii multiple se utiliyeaya parametrul MULTIPLE_INTERVAL_SELECTION list.setSelectedIndex(0); // primul element din lista este implicit selectat JScrollPane listScrollPane = new JScrollPane(list); -------String[] culori = { "Alb", "Negru", "Rosu", "Verde", "Albastru" }; JComboBox listaCulori = new JComboBox(culori); listaCulori.setSelectedIndex(1); // selecteaza elementul 2 (Negru) listaCulori.setEditable(true); Elemente pentru editare text Pentru a putea afisa, respectiv edita o linie de text se pot utiliza elemente de tip JTextField. Acestea permit afisarea si editarea unei linii de text, avand metode precum setText() si getText(). Pentru a edita mai multe linii de text se poate folosi clasa JTextPane. Gestionarea evenimentelor (listenere) Aplicatiile GUI sunt aplicatii orientate pe evenimente. In gestionarea evenimentelor intervin obiecte de tip Listener si Event. Pentru a trata evenimentele ce apar intr-o aplicatie trebuie: Implementata o clasa derivata dintr-o clasa Listener: public class MyClass implements XXXListener { public void eveniment(XXXEvent e) { ...//tratarea evenimentului... } } Inregistrata o instanta a clasei precedente pe post de listner pentru o componenta derivata din JComponent: oComponenta.addActionListener(instanceOfMyClass); Pentru a trata evenimentul de apasare pe un buton se va utiliza clasa ActionListener. /** Listens to the button. */ class ListenerPtButon implements ActionListener { private int numClicks = 0; public void actionPerformed(ActionEvent e) { 47

numClicks++; ((JButton)e.getSource()).setText(“Apasat: “ + numClicks); } } JButton butonulMeu = new JButton(“Apasa: 0”); butonulMeu. addActionListener(new ListenerPtButon()); APLICAŢIE import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; class ListBox1 extends JScrollPane { private JList list; public JList getList() { return list; } public ListBox1() { DefaultListModel listModel = new DefaultListModel(); listModel.addElement("Randul 1"); listModel.addElement("Randul 2"); listModel.addElement("Randul 3"); list = new JList(listModel); list.setVisibleRowCount(3); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(0); setViewportView(list); } } class SelectieLista implements ListSelectionListener { private JTextArea consola; ListModel listModel; public SelectieLista(JTextArea output, ListModel model) { super(); consola = output; listModel = model; } public void valueChanged(ListSelectionEvent e) { boolean isAdjusting = e.getValueIsAdjusting(); ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if(!isAdjusting) { 48

int primulel = e.getFirstIndex(); int ultimulel = e.getLastIndex(); for (int i = primulel; i<=ultimulel; i++) if(lsm.isSelectedIndex(i)) consola.append("\nDomnule student ati selectat : "+listModel.getElementAt(i)); } } } public class liste1 extends JFrame { public static void main(String args[]) { liste1 app = new liste1(); ListBox1 panouLista = new ListBox1(); JTextArea consola = new JTextArea(); ListSelectionModel listSelectionModel = panouLista.getList().getSelectionModel(); listSelectionModel.addListSelectionListener( new SelectieLista(consola, panouLista.getList().getModel())); JPanel panou = new JPanel(); panou.setLayout(new GridLayout(0,1)); panou.add(panouLista); panou.add(new JScrollPane(consola)); panou.setBorder( BorderFactory.createEmptyBorder(20, 20, 20, 20)); app.getContentPane().add(panou); app.pack(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); app.show(); consola.append("Mesaj "); } }

49

Un frame este o fereastră cu scop general prin intermediul cărei utilizatorii interacţionează în mod obişnuit cu aplicaţia. Într-o aplicaţie există cel puţin un frame care va servi drept fereastra principală. Un dialog este o fereastră cu scop limitat destinată în primul rând afişării unor informaţii cum sunt mesajele de eroare sau pentru preluarea unor răspunsuri simple (standard) gen da sau nu. Corespunzător acestor tipuri de ferestre există două clase specifice Frame şi Dialog. Stabilirea principalelor trăsături pentru ferestrele tip frame se realizează pe baza următoarelor metode: • setsize(lăţime, lungime) pentru stabilirea dimesiunilor; • setResizeable(true|flase) pentru a activa sau dezactiva posibilitatea redimesionării ferestrei de către utilizator; • setTitle(“text”) pentru desemna un titlu afişat în bara superioară a ferestrei; • setLocation(x, y) pentru a desemna originea colţului stânga-sus al ferestrei, de remarcat faptul că originea (0, 0) de la care sunt consideraţi factorii x şi y este colţul stânga sus al cadrului superior şi nu cel din stânga-jos; • setVisible(true|flase) pentru a afişa sau ascunde fereastra, echivalent cu metodele show() şi hide(), recomandate a fi înlocuite cu această metodă. Menirea unui unui astfel de frame este să găzduiască obiectele GUI cu care va interacţiona utilizatorul aplicaţiei. Distribuirea, localizarea sau poziţionarea obiectelor într-o fereastră poate fi controlată folosind un anumit model de gestionare -layout manager- care este desemnat prin metoda setLayout(). Dacă se optează pentru poziţionarea absolută (fără nici un factor de relativizare a obiectelor funcţie de mărimea ferestrei de exemplu) atunci metoda setlayout() este apelată în felul următor: setLayout(null); În acest fel obiectele (butoane, căsuţe de text, grupuri de opţiuni etc.) vor fi afişate întotdeauna la coordonatele stabilite de programator. Spre exemplu poziţionarea şi dimensionarea unui boton de comandă (clasa java.awt.Button sau javax.swing.JButton în Swing) se realizează prin metoda: setBounds(x, y, lăţime, lungime); Plasarea unor componente GUI într-un cadru implică în Java două declaraţii sau specificaţii: 1. declararea în clasa derivată din Frame (sau JFrame) a membrilor care desemnează componentele grafice ce vor fi afişate la execuţie; 50

2. la instanţierea ferestrei respective (sau mai exact a clasei derivate din Frame) se va specifica explicit (în cadrul constructorului) instanţierea componentelor grafice şi apoi afişarea lor prin metoda add(): add(InstanţăButon); import javax.swing.*; import java.awt.*; import java.awt.event.*; public class frame extends JFrame implements ActionListener, WindowListener{ // Declar doua componente care vor apartine cadrului FrameTest Button b1; Button b2; // In constructorul FrameTest activez butoanele, fereastra coresponzatoare // cadrului FrameTest, obiectele receptoare pentru evenimetele butoanelor // si cele receptoare pentru evenimentele ferestrei public frame(){ // stabilsc titlul ferestrei this.setTitle("Frame Test"); // inregistrez obiectul care va trata evenimentele ferestrei // adica (insusi cadrul TestFrame) this.addWindowListener(this); setLayout(null); // instantiez butoanele, le stabilesc dimensiunile, // inregistrez obiectele care vor trata evenimentele lor (cadrul FrameTest) // si le activez in cadrul FrameTest b1 = new Button("OK"); b2 = new Button("Cancel"); b1.setBounds(50, 100, 50, 50); b2.setBounds(50, 180, 50, 50); b1.addActionListener(this); b2.addActionListener(this); add(b1); add(b2); // stabilesc dimensiunile ferestrei cadrului FrameTesti o afisez setSize(300, 300); setVisible(true); } // metoda in care tratez evenimentele butonului b1 care va inchide fereastra // si va incheia procesul de executie public void actionPerformed(ActionEvent event){ if (event.getSource().equals(b1)) setVisible(false); System.exit(0); } 51

// Implementez metodele cerute de interfata WindowListener // la care se conformeaza obiectul care trateaza evenimentele ferestrei // (adica insusi cadrul FrameTest) public void windowActivated(WindowEvent event){} public void windowClosing(WindowEvent event){ System.exit(0); } public void windowClosed(WindowEvent event){} public void windowDeactivated(WindowEvent event){} public void windowIconified(WindowEvent event){} public void windowDeiconified(WindowEvent event){} public void windowOpened(WindowEvent event){} // metoda main care instantiaza cadrul TestFrame, afisind astfel fereastra // cu cele doua butoane public static void main(String[] args) { frame frm = new frame(); } }

Exemple de componente din biblioteca javax.swing JButton JCheckBox JComboBox JFileChooser

Un simplu buton de comandă care poate fi apăsat printr-un click de mouse Un buton care poate fi “bifat” O listă drop-down clasică care poate conţine opţional şi un camp textual editabil. Utilizatorul poate de asemenea selecta o valoare din listă care va fi afişată in câmpul textual O componentă care asigură un mecanism simplu pentru 52

JLabel JList JRadioButton JScrollPanel JSlider JTextArea JTextField

selectarea unui fişier O componentă care conţine un şir textual sau o imagine (nu reacţionează la evenimente de introducere/editare text) O componentă care permite utilizatorului să selecteze unul sau mai multe dintre elementele care le conţine Un buton de stare on/off. De obicei sunt organizate în grupuri dintre care unul singur poate fi selectat pe poziţia “on” O componentă care gestionează o porţiune vizualizabilă prin derularea conţinutului în cadrul unui view O componentă care permite utilizatorului să selecteze o valoare prin rularea unui indicator pe o scală (asemenea unui “potenţiometru”) O zonă care poate găzdui mai multe linii de text editabile sau nu O zonă pentru introducerea unei singure linii de text

JComponent este o subclasă a java.awt.Component şi va moşteni astfel multe dintre cele mai evidente proprietăţi ale acestei clase. Proprietăţile generice ale unei componente includ colorile pentru background şi foreground, locaţia în cadrul gazdă şi dimensiunea. Valorile acestora pot fi obţinute prin metodele: public Color getForeground () ; public Color getBackground () ; public Point getLocation () ; public Dimension getSize () ; public Rectangle getBounds() ; şi pot fi stabilite prin metodele: public void setForeground(Color.denculoare) - culoare text; public void setBackground(Color.denculoare)- culoare fundal; public void setLocation (Point p) ; public void setSize (Dimension d) ; public void setBounds(int x,int y,int Width,int Height) ; Color, point, Dimension şi Rectangle sunt clase AWT (definite în biblioteca java.awt). Clasa Color deţine un număr de referinţe de constante cum ar fi Color.red, Color.blue, Color.green. O instanţă a clasei Point reprezintă o poziţie relativă într-un spaţiu determinat prin coordonate x-y. Unităţile sunt în pixeli, iar originea (0, 0) înseamnă colţul din dreapta sus. Atributele unui Point pot fi accesate prin variabilele (membrii) publici x şi y de tip int. Acestă metodă are şi metode getX şi getY care returnează double, dar nu are metode setX şi setY. 53

O instanţă a clasei Dimension încapsulează lăţimea şi înălţimea, de asemenea în pixeli. Atributele pot fi accesate la fel ca şi în cazul clasei Point prin membrii publici height şi width. La fel există metodele: public double getHeight() public double getWidth() O instanţă a clasei Rectangle specifică o zonă într-un spaţiu de coordonate, astfel: membrii height şi width specifică înălţimea respectiv lăţimea, iar membrii x respectiv y specifică coordonatele obiectului relativ la părintele său (cel care îl conţine). Containere Un obiect care poate conţine componente se numeşte container. Acestea sunt modelate de către clasa abstractă java.awt.Container. Un aspect important, care simplifică lucrul cu intefeţele grafice, constă în faptul că această clasă este, la rândul ei, derivată din clasa Component. Prin urmare un Container poate conţine un alt Container. De asemenea clasa Swing JComponent este o subclasă a clasei Container. Cum orice JComponent poate conţine alte componente putem spune că:

• O componentă reprezintă un element distinct al unei interfeţe grafice utilizator, cum ar fi un buton, un câmp textual etc. • Un container reprezintă o componentă a interfeţei grafice utilizator care poate conţine alte componente. Componentă

Container

are

JComponent

Relaţiile Componentă Æ Container Æ JComponent Cel mai simplu container este JPanel. Un JPanel este folosit în general ca o regiune simplă în care sunt aduse şi grupate o colecţie de alte componente. Componentele sunt adăugate unui container prin metoda add(). De exemplu setul următor de instrucţiuni creează un JPanel şi adaugă două butoane: 54

JPanel p = new JPanel; p.add(new JButton(”Ok”)); p.add(new JButton(”Cancel”)); Containere top-level Un container top-level este un container care nu este inclus în nici un alt container. Clasele Swing JApplet, JDialog, JFrame şi JWindow reprezintă containerele top-level din Swing. Container-ul standard pentru o aplicaţie de interfaţă grafică este JFrame.Un JFrame este o fereastră cu titlu şi margini bine definite care poate fi mutată, redimensionată, minimizată (iconificată) etc. De asemenea un JFrame poate avea o bară de meniu. Sunt însă două lucruri mai deosebite ce merită menţionate în legătură cu această clasă: deşi este o clasă derivată în primul rând din java.awt.Container nu este totuşi o subclasă a JComponent, iar în al doilea rând aceasta delegă responsabilitatea gestiunii componentelor sale unui alt obiect de tip JRootPane. Un JRootPane derivă din JComponent şi are ca principală responsabilitate gestionarea conţinutul unui alt container. Un astfel de obiect este un compozit incluzând printre altele un (panou) content pane care de obicei este un JPanel şi reprezintă aria de lucru dintr-un JFrame, excluzând titlul, marginile şi meniul. Lucrurile par destul de complicate însă ceea ce trebuie reţinut este faptul că un JFrame are un JRootPane care conţine un „panou de componente” (un „content pane”). Pentru a obţine referinţa panoului de componente al unui JFrame se apelează la metoda getContentPane() care returnează un obiect de tip java.awt.Container. Adăugarea componentelor într-un JFrame După cum am arătat mai înainte, clasa JFrame este un container care îşi delegă responsabilitatea gestiunii componentelor sale unui JRootPane. Prin urmare pentru a adăuga un buton acesta trebui plasat de fapt pe „panoul de componente” cam în felul următor: JFrame f = new JFrame("JFrame Test"); f.setSize(300, 200); f.setVisible(true); JButton b = new JButton("OK"); Container cp = f.getContentPane(); cp.add(b); Adăugarea unei componente nu este şi condiţia suficientă pentru afişarea acesteia. Modul cum va fi „expusă” şi unde va fi expusă respectiva componentă cade în sarcina unui alt obiect cu care este echipat fiecare container, şi anume layoutManager-ul. Prin urmare un container delegă responsabilitatea poziţionării (dispunerii) şi dimensionării componentelor 55

unui obiect de tip layout manager, care trebuie să implementeze interfaţa java.awt.LayoutManager. Această interfaţă specifică metodele tuturor tipurilor de layout manager. În unele cazuri este folosită interfaţa java.awt.LayoutManager2 care extinde interfaţa originală LayoutManager. Pentru accesarea şi configurarea propriului layout manager un container are la dispoziţie metodele getLayout şi setLayout: public LayoutManager getLayout(); public void setLayout(LayoutManager manager); Iată în continuare câteva exemple privind modul cum sunt afişate componentele folosind diverse tipuri LayoutManager: Exemplu import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AfisareFrameFlowLayout { public static void main(String[] args) { JFrame f = new JFrame("Dispunere cu FlowLayout"); JButton b1 = new JButton("1"); JButton b2 = new JButton("2"); JButton b3 = new JButton("3"); JButton b4 = new JButton("4"); JButton b5 = new JButton("5"); Container cp = f.getContentPane(); cp.setLayout(new FlowLayout()); cp.add(b1); cp.add(b2); cp.add(b3); cp.add(b4); cp.add(b5); f.setSize(300, 100); f.setVisible(true); } } Rezultatul:

56

Exemplu import javax.swing.*; import java.awt.*; public class DisplayFrameBorderLayout { public static void main(String[] args) { JFrame f = new JFrame("Dispunere cu BorderLayout"); Container cp = f.getContentPane(); cp.setLayout(new BorderLayout()); cp.add(new JButton("Nord"), BorderLayout.NORTH); cp.add(new JButton("Sud"), BorderLayout.SOUTH); cp.add(new JButton("Est"), BorderLayout.EAST); cp.add(new JButton("Vest"), BorderLayout.WEST); cp.add(new JButton("Centru"), BorderLayout.CENTER); f.setSize(300, 200); f.setVisible(true); } } Rezultatul:

Exemplu import javax.swing.*; import java.awt.*; public class AfisareFrameGridLayout { public static void main(String[] args) { 57

JFrame f = new JFrame("Dispunere cu GridLayout"); Container cp = f.getContentPane(); cp.setLayout(new GridLayout(3, 2)); cp.add(new JButton("1")); cp.add(new JButton("2")); cp.add(new JButton("3")); cp.add(new JButton("4")); cp.add(new JButton("5")); cp.add(new JButton("6")); f.setSize(300, 200); f.setVisible(true); } } Rezultat:

Exemplu Modificările asupra grupului de componente dintr-un container după afişarea acestuia, va conduce la invalidarea containarului. Aceast fapt poate fi verificat prin metoda isValid() care va returna o valoare booleană. Revalidarea unui container echivalează cu reafişarea lui şi se realizează prin metoda validate(). public boolean isValid (); public void validate(); Exemplu import java.awt.*; import javax.swing.*; public class DisplayFrameGridLayout { public static void main(String[] args) { JFrame f = new JFrame("Dispunere cu GridLayout"); Container cp = f.getContentPane(); cp.setLayout(new GridLayout(3, 2)); cp.add(new JButton("1")); cp.add(new JButton("2")); cp.add(new JButton("3")); cp.add(new JButton("4")); cp.add(new JButton("5")); cp.add(new JButton("6")); 58

f.setSize(300, 200); f.setVisible(true); // adaugam inca doua butoane ceea ce va determina invalidarea containerului // si necesitatea reafisarii lui cp.add(new JButton("7")); cp.add(new JButton("8")); if (!cp.isValid()) // reafisam explicit containerul prin re-validarea lui cp.validate(); } } Cu rezultatul:

Evenimente şi „ascultători” După cum am menţionat într-unul din paragrafele anterioare, interacţiunile interfeţelor utilizator grafice se bazează pe paradigma evenimentelor. Anumite evenimente sunt de nivel scăzut cum ar fi apăsarea şi eliberarea unei taste, mutarea cursorului mouse-lui sau apăsarea unui buton al acestuia, iar altele sunt de nivel înalt cum ar fi selectarea unei opţiuni dintr-un meniu, apăsarea unui “buton” (componenta grafică) sau introducere de text într-un câmp. Evenimentele de nivel înalt implică de fapt mai multe de nivel mai scăzut. De exemplu introducerea de text într-un câmp implică mutarea cursorului mouseului, apăsarea butonului mouse-ului şi apăsarea şi eliberarea mai multor taste. Iată câteva dintre categoriile de evenimente întâlnite: Categoria de Descriere evenimente Apăsarea şi eliberarea tastelor Key event Apăsarea şi eliberarea butoanelor mouse-ului Mouse event Drag & drop Ascunderea, afişarea, redimensionarea sau mutarea unei Component componente event Container event Adăugarea sau îndepărtarea unei componente dintr-un container Deschiderea, închiderea, minimizarea (iconificarea), Window event reconstituirea (deiconificarea), activarea, dezactivarea unei ferestre 59

Preluarea sau pierderea focus-ului de către o componentă Eveniment de nivel înalt indicând o acţiune definită la nivelul componentei (de exemplu un buton poate fi apăsat, un checkbox poate fi selectat, apăsarea tastei ENTER/RETURN pentru un câmp de text) Eveniment de nivel înalt care are loc atunci când un utilizator Item event selectează un checkbox, buton radio sau opţiune dintr-o listă Document event Generat de către un obiect TextComponent atunci când îi este modificat conţinutul Focus event Action event

Un aspect important de reţinut este faptul instanţele de tip Component reprezintă surse de evenimente, mai exact evenimentele au loc în contextul componentelor. Majoritatea evenimentelor sunt modelate având la bază clasa abstractă java.awt.Event, care ea însăşi este o subclasă a java.util.EventObject. Referinţa obiectului sursă al unui eveniment poate fi obţinută prin folosirea metodei getSource() a obiectelor de tip Event. public object getSource () ; Construirea interfeţelor grafice – modul de utilizare al principalelor componente Rolul layout-urilor şi container-elor în Swing În cele ce urmează revenim pentru moment la componente şi container-e. După cum am evidenţiat mai înainte, un control reprezintă un element afişabil pe ecran, un container reprezintă o zonă ce grupează fizic (conţine) controale şi/sau eventual alte container-e, iar o componentă am putea spune că reprezintă o unitate constructivă pentru interfeţele grafice Java luând forma concretă fie a controalelor fie a containerelor. Container-ele disponibile prin bibliotecile Swing sunt diferite de cele din biblioteca AWT fiind organizate pe mai multe straturi:

Straturile containerelor Swing Aceste straturi pot fi descrise, pe scurt, astfel: • JRootPane reprezintă structura de date care conţine toate celelalte “panouri” provenind din containerele Swing. • JLayeredPane gestionează “panourile” pentru meniu şi pentru celelalte componente grafice. Prin urmare acest container conţine altele două: JMenuBar şi JContentPane. De asemenea, tot la acest nivel, apare şi noţiunea z-order, adică ordinea în care sunt stratificate componentele (care componente apar deasupra altora). 60

• JContentPane reprezintă un container Swing în care vor fi adăugate toate celelalte componente (controale sau alte container-e) şi la nivelul căruia este stabilită “politica” de dispunere a acestora (noţiunea de layout manager). • JMenuBar va fi obiectul prin intermediul căruia sunt gestionate eventualele meniuri bară ataşate applet-ului sau frame-ului respective. • JGlassPane reprezintă un container transparent care este aşezat peste toate celelalte componente şi container-e şi permite interceptarea evenimentelor legate mouse, precum şi posibilitatea schiţării unor obiecte grafice peste întregul conţinut fără să afecteze vreo componentă existentă. Referinţele acestor obiecte pot fi obţinute astfel: JRootPane rp = getRootPane(); JLayeredPane lp = getLayeredPane(); JMenuBar mb = getJMenuBar(); Container cp = getContentPane(); Component gp = getGlassPane(); Acest mod de structurare a conţinutului inerfeţelor grafice este comun tuturor container-elor top-level, adică cele care nu sunt subincluse în altele şi care afişează ferestrele principale: JFrame, JWindow, JApplet, JDialog. Iată câteva din caracteristicile esenţiale pentru aceste container-e top-level: • JFrame reprezintă o fereastră care conţine implicit: o bară de titlu, o bară de meniu, un chenar (margine – numită inset) şi care poate fi închisă sau minimizată (iconificată). • JApplet este o subclasă derivată din JPanel care reprezintă un container generic care se regăseşte întotdeauna în alt container însă nu are proprietatea de a “pluti” liber pe un desktop. Obiectele create din JApplet (de altfel la fel ca şi cele din clasa Applet din AWT) pot fi afişate direct într-o pagină web obişnuită. Ele conţin o serie de metode care iniţializează şi controlează execuţia lor în pagina Web (sau în AppletViewer în faza de test) start(), init(), stop(), destroy(), precum şi o serie de metode pentru a lucra cu informaţii multimedia: sunete şi imagini. • JWindow reprezintă un container gol – o fereastră lipsită implicit de conţinut grafic, neavând nici măcar chenar. O fereastră nu este folosită direct , ci prin intermediul subclaselor specializate JFrame şi JDialog. Principalele metode folosite în manipularea obiectelor JLabel: Metoda Acţiune Obţine Stringul afişat de către obiectul JLabel String getText() Stabileşte printr-un String textul ce va fi afişat void setText(String text) int getHorizontalAlignment() Obţine un întreg care indică modul de aliniere a conţinutului etichetei relativ la axa x 61

int getVerticalAlignment() Icon getIcon() void setIcon(Icon icon) Component getLabelFor() void setLabelFor(Component c) void setHorizontalAlignment(int alignament) void setVerticalAlignment(int alignament)

Obţine un întreg care indică modul de aliniere a conţinutului etichetei relativ la axa y Obţine obiectul Icon afişat de către obiectul JLabel Stabileşte obiectul Icon afişată de componenta JLabel Obţine componenta care este etichetată folosind obiectul JLabel Stabileşte componenta care va fi etichetată cu obiectul JLabel Stabileşte prin întregul specificat modul de aliniere relativ la axa x Stabileşte prin întregul specificat modul de aliniere relativ la axa y

Pentru a obţine un obiect JLabel care afişează un text simplu putem construi o astfel de etichetă ca în exemplul următor: import java.awt.*; import javax.swing.*; public class ExempluJLabel extends JFrame{ public ExempluJLabel(){ Container cp = getContentPane(); JLabel jlabel = new JLabel("Student la Universitatea Titu Maiorescu"); cp.setLayout(new FlowLayout()); cp.add(jlabel); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 100); } public static void main(String[] args) throws Exception{ UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLook AndFeel"); new ExempluJLabel().show(); } } Iată rezultatul:

62

Câmpuri pentru text JTextField Biblioteca SWING introduce, pentru a gestiona câmpurile care pot primi text din partea utilizatorilor, componenta JTextField ce lucrează asemănător cu java.awt.TextField (dar care nu este derivată din aceasta). java.lang.Object | ___ java.awt.Component | ___ java.awt.Container | ___ javax.swing.JComponent | ___ javax.swing.text.JTextComponent | ___ javax.swing.JTextField Constructorii principali ai componentei JTextField sunt: Constructor JTextField () JTextField (int columns) JTextField(String text) JTextField(String text, int columns)

Acţiune Creează un nou câmp gol Creează un nou obiect JTextField fără conţinut de lungimea indicată (în coloane) Creează un nou obiect JTextField conţinând textul specificat Creează un nou obiect JTextField conţinând textul specificat şi având (afişând) lungimea indicată (în coloane)

Principalele metode ale componentei JTextField sunt următoarele: Metoda Acţiune Obţine String-ul conţinut în câmp String getText() Stabileşte printr-un String textul ce va fi conţinut void setText(String text) de către obiectul JTextField int getHorizontalAlignment() Obţine un întreg care indică modul de aliniere relativ la axa x Stabileşte prin întregul specificat modul de void setHorizontalAlignment(int aliniere relativ la axa x alignament) Obţine dimensiunile (lăţime, lungime printr-un Dimension obiect de tip Dimension) preferenţiale getPreferredSize() Obţine numărul de coloane pe care este afişat int getColumns() textul Stabileşte numărul de coloane pe care este afişat void setColumns(int textul columns) Pentru a obţine un obiect JTextField putem proceda ca în exemplul următor: import java.awt.*; import javax.swing.*; 63

public class test extends JFrame{ public test(){ Container cp = getContentPane(); JLabel jlabel = new JLabel("Student la Universitatea Titu Maiorescu"); cp.setLayout(new FlowLayout()); cp.add(jlabel); JTextField informatie = new JTextField(); //cp.setLayout(new FlowLayout()); cp.add(informatie); informatie.setText("Informatie cu JTextField"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 100); } public static void main(String[] args) throws Exception{ UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLook AndFeel"); new test().show(); } } Rezultatul este:

Obiectele JtextField generează evenimente legate de apăsarea tastatelor şi un ActionEvent atunci când utilizatorul apasă tasta Enter/Return pentru a încheia introducerea textului şi eventual pentru a-l valida. Codul pentru implementarea modelului de evenimente legate de această componentă ar putea fi: text.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ // secvenţa de cod ce trebuie executată la apariţia ecenimentului sau // apel la o eventuală metodă din cadrul părinte în care să fie tratat explicit acest eveniment System.out.println("Informatia definita este: " + e.getActionCommand()); } }); care poate fi adăugat în metoda init() a clasei ExempluTextField (eventual la sfârşit, sau oricum după instanţierea clsei JTextField). 64

Butoane – AbstractButton şi JButton În Swing, toate butoanele sunt derivate din clasa AbstractButton care furnizează baza pe care sunt construite toate clasele pentru butoane din Java. Iată ierarhia de moştenire pentru această clasă: java.lang.Object | ___ java.awt.Component | ___ java.awt.Container | ___ javax.swing.JComponent | ___ javax.swing.AbstractButton Putem obţine un JButton astfel: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class exemplu1 extends JFrame{ //JButton button = new JButton("Apasa"); JButton button = new JButton("Apasa", new ImageIcon("C:\\Documents and Settings\\My Documents\\My Pictures\\a1.jpg")); JTextField text = new JTextField(30); public exemplu1() { // stabilsc titlul ferestrei this.setTitle("test"); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(button); cp.add(text); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ text.setText("Ai apasat pe buton"); } }); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 300); } public static void main(String[] args) throws Exception{ UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLook AndFeel"); new exemplu1().show(); } 65

} Se poate observa că în metoda init(), după instanţierea clasei JButton, este apelată la un moment dat metoda addActionListener() pentru înregistrarea unui listener care să trateze evenimentele acestuia. De asemenea, un JButton poate afişa inclusiv o pictogramă dacă este construit astfel: JButton button = new JButton("Apasa", new ImageIcon("C:\\Documents and Settings\\My Documents\\My Pictures\\a1.jpg")); Rezultatul este:

Butoane checkbox - JCheckBox După cum se ştie, un checkbox reprezintă un control grafic care oferă posibilitatea selectării unei valori booleene, însoţit fiind de un text explicativ. Biblioteca Swing oferă pentru obţinerea unui astfel de buton clasa JCheckBox care anumite avantaje faţă de clasa similară din AWT, CheckBox, şi anume posibilitatea afişării unei imagini însoţitoare. java.lang.Object | ___ java.awt.Component | ___ java.awt.Container | ___ javax.swing.JComponent | ___ javax.swing.AbstractButton |___ javax.swing.JToggleButton | ___ javax.swing.JCheckBox Principalii constructori care pot fi folosiţi pentru instanţierea acestei clase sunt: Constructor Acţiune JCheckBox() 66

JCheckBox(String text) JCheckBox(String text, Boolean selected)

Construieşte un JCheckBox ce afişează textul specificat şi indică dacă este, sau nu, selectat iniţial

JCheckBox(Icon image) JCheckBox(String text, Icon icon) În ce priveşte metodele, manipularea acestor obiecte se face în principal prin setSelected(), isSelected(), setText(), getText() etc. moştenite din superclase, în special de la clasa JabstractButton. Grupuri de butoane - JButtonGroup Butoanele tip checkbox derivă din clasa JToggleButton, a cărei principală caracteristică este obţinerea de butoane care să poată fi afişate grafic ca selectate sau deselectate şi să fie însoţite de text simplu sau de diferite imagini. O altă caracteristică importantă a acestor butoane este că pot fi grupate într-o structură comună astfel încât la un moment dat să poată fi selectat numai unul dintre ele. Spre exemplu: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class exemplu1 extends JFrame{ public exemplu1(){ Container contentPane = getContentPane(); ButtonGroup grup = new ButtonGroup(); JToggleButton [] butoane = new JToggleButton[]{ new JToggleButton(new ImageIcon("C:\\flori\\p1.jpg")), new JToggleButton(new ImageIcon("C:\\flori\\p1.jpg")), new JToggleButton(new ImageIcon("C:\\flori\\p1.jpg")), new JToggleButton(new ImageIcon("C:\\flori\\p1.jpg")), new JToggleButton(new ImageIcon("C:\\flori\\p1.jpg")) }; contentPane.setLayout(new FlowLayout()); for (int i = 0; i < butoane.length; ++i){ grup.add(butoane[i]); contentPane.add(butoane[i]); } setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 300); } public static void main(String[] args) throws Exception{

67

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLook AndFeel"); new exemplu1().show(); } } Rezultatul ar trebui să fie următorul:

Butoane radio – JRadioButton Butoanele radio se folosesc atunci când se doreşte construirea unui grup de butoane de opţiuni însă la un moment dat numai unul dintre ele să fie selectat. La fel ca şi în cazul checkbox-urilor, biblioteca Swing vine cu propria sa clasă JRadioButton pentru a obţine butoane de acest fel. Iată ierarhia de moştenire în acest caz: java.lang.Object | ___ java.awt.Component | ___ java.awt.Container | ___ javax.swing.JComponent | ___ javax.swing.AbstractButton |___ javax.swing.JToggleButton | ___ javax.swing.JRadioButton La fel ca în cazul checkkbox-urilor, constructorii clasei JRadioButton pemit crearea de butoane radio însoţite de text, imagini sau text şi imagini, şi specificarea stării de selectat/deselectat: Constructor Acţiune 68

JRadioButton() JRadioButton(String text) JRadioButton(String text, Boolean selected)

Construieşte un JCheckBox ce afişează textul specificat şi indică dacă este, sau nu, selectat iniţial

JRadioButton(Icon image) JRadioButton(String text, Icon icon) Pentru a demonstra modul în care pot fi create şi folosite aceste butoane am construit exemplul următor: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class exemplu1 extends JFrame{ JLabel jlabel; ButtonGroup grup; JRadioButton [] butoaneRadio; JRadioButton b1; public exemplu1() { Container contentPane = getContentPane(); jlabel = new JLabel(); jlabel.setIcon(new ImageIcon("C:\\flori\\p1.jpg")); contentPane.add(jlabel); grup = new ButtonGroup(); butoaneRadio = new JRadioButton[]{ new JRadioButton("help"), new JRadioButton("exit"), new JRadioButton("find"), }; contentPane.setLayout(new FlowLayout()); for (int i = 0; i < butoaneRadio.length; ++i){ grup.add(butoaneRadio[i]); contentPane.add(butoaneRadio[i]); butoaneRadio[i].addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ refacere_imagine(e); } }); } butoaneRadio[0].setSelected(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 300); } 69

public void refacere_imagine(ItemEvent e){ if (butoaneRadio[0].isSelected()) jlabel.setIcon(new ImageIcon("C:\\flori\\p1.jpg")); //if (e.getItemSelectable() == butoaneRadio[1]) if (butoaneRadio[1].isSelected()) jlabel.setIcon(new ImageIcon("C:\\flori\\p2.jpg")); //if (e.getItemSelectable() == butoaneRadio[2]) if (butoaneRadio[2].isSelected()) jlabel.setIcon(new ImageIcon("C:\\flori\\p3.jpg")); } public static void main(String[] args) throws Exception{ UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLook AndFeel"); new exemplu1().show(); } } Rezultatul este:

Construirea unei fereastra principale a aplicaţiilor tip desktop cu meniuri Swing De regulă, ferestrele principale ale aplicaţiilor desktop reprezintă calea esenţială pentru accesul la funcţiile principale ale aplicaţiei. De regulă acest lucru realizat printr-un meniu însoţit, eventual, şi de o bară de instrumente. Crearea meniurilor Modelul orientat obiect al meniurilor în Swing are următoarele caracteristici: 70

- bară principală reprezintă o instanţă a clasei JMenuBar, sau, pentru meniurile contextuale, JPopUpMenu; - meniurile accesebile din bara principală sunt obţinute din clasa JMenu; - elementele individuale ale unui menu (instanţă JMenu) sunt construite pe baza clasei JMenuItem care are următoarele subclase: JCheckBoxMenuItem, JRadioButtonMenuItem şi JMenu. Prin urmare un element individual dintr-un meniu poate fi, la rândul său, un al submenu (instanţă JMenu); Ca urmare definiţia celui mai simplu meniu ar putea fi următoarea: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class MainMenuBar extends JMenuBar{ JFrame frmParent; public MainMenuBar() { JMenu fileMenu = new JMenu("File"); JMenu editMenu = new JMenu("Edit"); JMenu quitMenu = new JMenu("Quit"); // Meniul File: Open, Save, Close JMenuItem openItem = new JMenuItem("Open"); JMenuItem saveItem = new JMenuItem("Save"); JMenuItem closeItem = new JMenuItem("Close"); //Meniul Edit: Cut, Copy, Paste, Find (Find, Replace) JMenuItem cutItem = new JMenuItem("Cut"); JMenuItem copyItem = new JMenuItem("Copy"); JMenuItem pasteItem = new JMenuItem("Paste"); JSeparator separator1 = new JSeparator(); JMenu findMenu = new JMenu("Find"); JMenuItem findItem = new JMenuItem("Find"); JMenuItem replaceItem = new JMenuItem("Replace"); //Meniul Quit JMenuItem exitItem = new JMenuItem("Exit"); JMenuItem aboutItem = new JMenuItem("About"); fileMenu.add(openItem); fileMenu.add(saveItem); fileMenu.add(closeItem); editMenu.add(cutItem); editMenu.add(copyItem); editMenu.add(pasteItem); 71

editMenu.add(separator1); findMenu.add(findItem); findMenu.add(replaceItem); editMenu.add(findMenu); editMenu.add(new JCheckBox("Bifa")); quitMenu.add(exitItem); quitMenu.add(aboutItem); add(fileMenu); add(editMenu); add(quitMenu); } } Pentru a dispune un meniu într-un formular, avem nevoie de o instanţă JFrame pentru bara de meniu, stabilită prin metoda setJMenuBar(). De exemplu clasa principala este: Import java.awt.*; import javax.swing.*; import java.awt.event.*; public class FormMain extends JFrame{ public FormMain() { this.setJMenuBar(new MainMenuBar()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(500, 500); this.setVisible(true); } public static void main(String[] args) { new FormMain(); } } va avea la runtime următorul rezultat:

TEME PRACTICE Se vor testa cel putin 5 exemple din acest modul, se vor comenta şi vor fi incluse într-un “PROJECT” cu numele studentului. 72

MODULU V Lucru ca baze de date in JAVA Aplicaţiile care folosesc baze de date sunt, în general, sunt aplicaţii complexe folosite pentru gestionarea unor informatii de dimensiuni mai mari într-o maniera sigură si eficientă. O bază de date reprezintă o modalitate de stocare a unor informatii (date) pe un suport extern, cu posibilitatea regăsirii acestora. Uzual, o bază de date este memorată într-unul sau mai multe fişiere. Crearea unei baze de date - se face cu aplicaţii specializate oferite de producătorul tipului respectiv de bază de date. Accesul la o baza de date - Se face prin intermediul unui driver specific tipului respectiv de bază de date. Acesta este responsabil cu accesul efectiv la datele stocate, fiind legatura între aplicaţie şi baza de date. JDBC (Java Database Connectivity) este o interfaţă standard SQL de acces la baze de date. JDBC este constituită dintr-un set de clase si interfeţe scrise în Java, furnizând mecanisme standard pentru proiectanţii aplicatiilor de baze de date. Pachetul care oferă suport pentru lucrul cu baze de date este java.sql. Folosind JDBC este usor să transmitem secvenţe SQL către baze de date relaţionale. Cu alte cuvinte, nu este necesar să scriem un program pentru a accesa o baza de date Oracle, alt program pentru a accesa o baza de date Sybase şi aşa mai departe. Este de ajuns să scriem un singur program folosind API-ul JDBC şi acesta va fi capabil să trimită secvente SQL bazei de date dorite. Bineînţeles, scriind codul sursă în Java, ne este asigurată portabilitatea programului. Deci, iată două motive puternice care fac combinaţia Java - JDBC demnă de luat în seamă. Fiind robust, sigur, usor de folosit, usor de înteles, Java este un excelent limbaj pentru a dezvolta aplicaţii de baze de date. Tot ceea ce-i lipseste este modalitatea prin care aplicatiile Java pot comunica cu bazele de date. Aici vine însa JDBC-ul care oferă acest mecanism. In linii mari, JDBC face trei lucruri: stabileşte o conexiune cu o baza de date, trimite secvenţe SQL, prelucrează rezultatele . Conectarea la o baza de date

Procesul de conectare la o bază de date implica două operatii: - încarcarea în memorie a unui driver corespunzător - realizarea unei conexiuni propriu-zise O conexiune (sesiune) la o bază de date reprezintă un context prin care sunt trimise secvenţe SQL şi primite rezultate. Intr-o aplicaţie pot exista mai multe conexiuni simultan la baze de date diferite sau la aceeasi baza. Clasele si interfetele responsabile cu realizarea unei conexiuni sunt: - clasa DriverManager, ce se ocupă cu înregistrarea driverelor ce vor fi folosite în aplicatie - interfata Driver, pe care trebuie să o implementeze orice clasa ce descrie un driver clasa DriverPropertyInfo - interfata Connection, descrie obiectele ce modelează o conexiune propriu-zisă cu baza de date Incarcarea în memorie a unui driver

73

Primul lucru pe care trebuie să-l facă o aplicaţie în procesul de conectare la o baza de date este să încarce în memorie clasa ce implementeaza driver-ul necesar comunicării cu respectiva baza de date. Acest lucru poate fi realizat prin mai multe modalitati: 1. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver()); 2. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 3. System.setProperty("jdbc.drivers", "sun.jdbc.odbc.JdbcOdbcDriver"); 4. java -Djdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver Specificarea unei baze de date

Odată ce un driver JDBC a fost încarcat în memorie, acesta poate fi folosit la stabilirea unei conexiuni cu o bază de date. Având în vedere faptul că pot exista mai multe drivere înregistrate în memorie, trebuie să avem posibilitea de a specifica pe lângă identificatorul bazei de date si driverul ce trebuie folosit. Aceasta se realizează prin intermediul unei adrese specifice, numită JDBC URL, ce are urmatorul format: jdbc:sub-protocol:identificator_baza_de_date

Câmpul sub-protocol denumeşte tipul de driver ce trebuie folosit pentru realizarea conexiunii si poate fi odbc, oracle, sybase, db2 şi aşa mai departe. Identificatorul bazei de date este un indicator specific fiecărui driver care specifică baza de date cu care aplicaţia doreşte să interactioneze. In functie de tipul driver-ului acest identificator poate include numele unei maşini gazdă, un număr de port, numele unui fişier sau al unui director, etc. Realizarea unei conexiuni

Metoda folosită pentru realizarea unei conexiuni este getConnection din clasa DriverManager si poate avea mai multe forme: Connection c = DriverManager.getConnection(url); Connection c = DriverManager.getConnection(url, username, password); Connection c = DriverManager.getConnection(url, dbproperies); O conexiune va fi folosită pentru: - crearea de secvenţe SQL ce vor fi folosite pentru interogarea sau actualizarea bazei - aflarea unor informaţii legate de baza de date (meta-date) Clasa Connection asigură suport pentru controlul tranzacţiilor din memorie către baza de date prin metodele commit, rollback, setAutoCommit . Efectuarea de secvente SQL

Odată facută conectarea cu DriverManager.getConection(), se poate folosi obiectul Connection rezultat pentru a se crea un obiect de tip Statements, cu ajutorul căruia putem trimite secvente SQL către baza de date. Cele mai uzuale comenzi SQL sunt cele folosite pentru: - interogarea bazei de date (SELECT) - actualizarea bazei de date (INSERT, UPDATE, DELETE) 74

Connection c = DriverManager.getConnection(url); Statement s = c.createStatement(); ResultSet r = s.executeQuery ("SELECT * FROM un_tabel ORDER BY o_coloana"); s.executeUpdate("DELETE * FROM un_tabel"); Metoda executeQuery trimite interogari SQL către baza de date şi primeşte răspuns într-un obiect de tip ResultSet. Obţinerea şi prelucrarea rezultatelor

Interfaţa ResultSet String query = "SELECT cod, nume FROM localitati ORDER BY nume"; ResultSet r = s.executeQuery( query ); while (r.next()) { System.out.println (r.getString ("cod") + "," + r.getString ("nume") ); }

Interfaţa ResultSetMetaData ResultSet r = s.executeQuery(" SELECT * FROM localitati" ); ResultSetMetaData rsmd = r.getMetaData(); System.out.println("Coloane: " + rsmd.getColumnCount());

Declaraţii

Declaraţiilor sunt susţinute de PreparedStatement şi CallableStatement.

interafaţa

Statement

şi

subclasele

sale

Interfaţa Statement Defineşte metode pentru executarea declaraţiilor SQL care nu conţin parametrii de marcaj (markers) Realizarea unei conexiuni se face astfel: Connection con = DriverManager.getConnection(url, user, password);

Dacă se utilizează driverul JDBC-ODBC Bridge, URL-ul JDBC va începe cu jdbc:odbc. Cealaltă parte a URL-ului este numele sursei de date sau a sistemului de baze de date. Crearea unei declaraţii se face: Statement stmt = con.createStatement();

Fiecare obiect conexiunepoate crea mai multe declaraţii. Astfel pentru obiectul anterior se poate adăuga: Statement stmt1 = con.createStatement(); Statement stmt2 = con.createStatement();

Executarea obiectelor Statement depinde de tipul declaraţiei SQL ce trebuie efectuată. Dacă obiectul Statement este o interogare, se returnează un obiect ResultSet prin metoda executeQuery(). Această metodă creează obiectul ResultSet care conţine datele returnate de interogare. 75

Obţinerea unor date din tabele se face: Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(” select Nume, Prenume from Tabel ”); while( rs.next()) { ... }

Utilizarea metodei execute() este condiţionată de existenţa unui string SQL. În acest caz actulizează fie un cont, fie un obiect ResultSet . Valoarea returnată este true dacă primul rezultat este un obiect ResultSet şi false dacă se actualizează un cont. Pentru crearea unui tabel se poate utiliza secvenţa: stmt.executeUpdate(” CREATE TABLE Tabel (Nume char(20), Prenume char(20), Adresa char (20), matr int , anul_de_studiu int) ”); Aplicatie pentru crearea unei tabele intr-o baza de date Access. import java.sql.*; public class creare { public static void main(String args[]) { Connection con; // The connection to the database. try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:stud"); Statement stmt = con.createStatement(); stmt.executeUpdate("CREATE TABLE produse" + "(cod_p INTEGER not null primary key," + "nume_produs VARCHAR(50)," + "cod_furnizor INTEGER," + "denumire_furnizor VARCHAR(50)," + "data_intrare DATE, pret INTEGER, cantitate FLOAT,"+ "EMAIL_ADDRESS VARCHAR(50))"); } catch(ClassNotFoundException e){ System.out.println(e.toString()); } catch(SQLException e){ System.out.println(e.toString()); } } }

76

Probleme propuse 1. Sa se realizeze o interfata cu care se realizeaza incarcarea unei tabele. Tabela se numeste cursuri. Rezolvare ......... Connection dB=null; ResultSet results=null; String sql; String s1= jTextField1.getText(); String s2= jTextField2.getText(); String s3= jTextField3.getText(); int i,j; i=Integer.parseInt(s1); j=Integer.parseInt(s3); String url="jdbc:odbc:Facultate"; String d; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e) { System.out.println("Nu s-a putut incarca driver-ul"); } try{ dB = DriverManager.getConnection(url); PreparedStatement pstmt = dB . prepareStatement ("INSERT INTO Cursuri(id_curs,nume_curs,nr_credite)" + "Values('" + i + "','" + s2 + "','" + j + "');"); pstmt.executeUpdate(); // System.out.println("Inregistrarea a fost adaugata cu succes."); jLabel4.setText(" Inregistrarea a fost adaugata cu succes"); } catch(SQLException e) { System.err.println("SQLException: " + e); }

77

2. Sa se realizeze o interfata cu ajutorul careia se localizeaza dupa un ID un student in tabela Studenti. Rezolvare ......... Connection dB=null; ResultSet results=null; String sql; String s1=jTextField1.getText(); String url="jdbc:odbc:Facultate"; String num,d="",d1=""; int i,j=0,cr=0; i=Integer.parseInt(s1); System.out.println(i); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e) { System.out.println("Nu s-a putut incarca driver-ul"); } try { dB = DriverManager.getConnection(url); Statement stmt=dB.createStatement(); results=stmt.executeQuery ("SELECT nume,credite FROM Studenti WHERE "+"(nr_matricol='" +s1+ "') "); while(results.next()) { d=results.getString("nume"); d1=results.getString("credite"); cr=Integer.parseInt(d1); } jTextField2.setText(d); jTextField3.setText(d1); } catch(SQLException e) { System.err.println("SQLException: " + e);

}

3 . Sa se realizeze o interfata, ca in figura alaturata, astfel incat fiecare buton sa contina si actiunile corespunzatoare.

78

4. Aplicatie practica pentru Conectarea la o bază de date MySQL Acest document care demonstrează cum se instituie o conexiune la o bază de date MySQL de la NetBeans IDE 6.7. Odata conectat, puteţi începe lucrul cu MySQL în baza de date a IDE Explorer prin crearea de noi baze de date şi tabele, popularea tabele cu date, şi rulează SQL queries pe structuri de date şi de conţinut. Acest ghid este conceput pentru incepatori, cu o înţelegere de bază de gestionare a bazei de date, care doresc să aplice cunoştinţele lor de a lucra cu MySQL în NetBeans IDE. MySQL

este un popular sistem Open Source de gestionare a bazelor de date relaţionale

(RDBMS), frecvent utilizate în aplicaţii de web, datorită vitezei sale, flexibilitate şi fiabilitate. MySQL angajează SQL, sau Structured Query Language, pentru accesarea şi de prelucrare a datelor conţinute în bazele de date. Durata estimată: 30 minute Continut



Configurarea MySQL server Proprietăţi



Pornirea server MySQL



Crearea şi Conectarea la baza de date



Crearea tabelele bazei de date



Lucrul cu tabelul de date



Rularea unui script SQL



A se vedea de asemenea,

79

Pentru a urma acest tutorial, aveţi nevoie de următoarele produse software şi resurse.

Software-ul sau de Resurse

Versiune Required

NetBeans IDE

6.5 sau 6.7 Java Version

Java Development Kit (JDK)

Versiunea 6 sau versiunea 5

Baza de date MySQL

Versiunea 5.x

Notă: Acest ghid presupune că aveţi deja RDBMS MySQL instalat si configurat pe computer. Dacă instalaţi pentru prima dată, vă rugăm să consultaţi documentaţia oficială MySQL pentru ajutor.

Configurarea MySQL server Proprietăţi NetBeans IDE 6.7 vine bundled cu suport pentru RDBMS MySQL. Înainte de a putea accesa baza de date MySQL Server în NetBeans IDE, trebuie să configuraţi MySQL proprietăţile Server. 1.

În fereastra Servicii, extindeţi nodul Baze de date, faceţi clic dreapta pe MySQL server nodul si alegeti Properties. MySQL server Proprietăţi deschide caseta de dialog.

2.

IDE localhost intră ca numele de gazdă implicit de server şi 3306 ca număr implicit serverul de port. Dacă această informaţie este corectă, introduce numele de utilizator Administrator (dacă nu este afişat). Notă: Aveţi nevoie de acces administrative, pentru a putea crea şi de a elimina baze de date.

3.

Introduceţi parola de administrator. Implicit este setat la gol. Notă: O parola-martor poate fi, de asemenea, o parolă.

4.

Faceţi clic pe fila Administrare Proprietăţi din partea de sus a casetei de dialog. Fila Admin Proprietăţi este apoi afişat, permiţându-vă să introduceţi informaţii pentru controlul MySQL server.

5.

În calea / URL-ul pentru a admin domeniul instrument, tip sau răsfoiţi la locaţia a cererii dvs., cum ar fi MySQL Administrare Admin Tool MySQL, phpMyAdmin, sau alt web-bază unelte de administrare.

80

Notă: mysqladmin este instrumentul de MySQL admin găsit în folderul bin din directorul de instalare MySQL. Este un instrument de linie de comandă şi nu Ideal pentru utilizarea cu IDE. Tip de nici un argument pentru instrumentul admin în domeniul Argumente. 6.

În cale pentru a porni de comandă, tastaţi sau răsfoiţi la locaţia de comanda a începe MySQL. Pentru a găsi comanda început, căutaţi mysqld în folderul bin din directorul de instalare MySQL. Notă: binar recomandat pentru Unix şi NetWare este mysql_safe Comandă începe pot varia, de asemenea, în cazul în care MySQL a fost instalat ca parte a unei instalaţii AMP. Tip de nici un argument pentru comanda începe în domeniul Argumente.

7.

Din cale pentru a opri câmpul de comandă, tastaţi sau răsfoiţi la locaţia de oprire comanda MySQL. Aceasta este, de obicei calea spre mysqladmin în folderul bin din directorul de instalare MySQL. În cazul în care comanda este mysqladmin în domeniul Argumentele, de -u

root stop de a acorda permisiuni de root pentru oprirea serverului. 8.

Când aţi terminat, fila Proprietăţi Admin ar trebui să semene cu figura de mai jos. Dacă sunteţi satified cu configuraţia dvs., faceţi clic pe OK.

Pornirea server MySQL Înainte de a vă puteţi conecta la o bază de date MySQL Server, trebuie să se asigure mai întâi că MySQL Bază de date Server se execută pe calculatorul dumneavoastră. MySQL Server nod în cadrul Serviciului indică dacă MySQL Server Bază de date este conectat, după cum se arată în următoarea imagine.

81

După ce asigurându-se că MySQL Server Bază de date se execută pe maşina dvs., faceţi clic dreapta pe Colecţii de date> MySQL nod Server în fereastra Servicii şi alegeţi Connect.

Atunci când sa extins, nodul MySQL server afişează toate bazele de date disponibile MySQL.

Crearea şi Conectarea la baza de date Instanţă Un mod comun de a interacţiona cu bazele de date se face printr-un editor SQL. NetBeans IDE are un editor de built-in SQL pentru acest scop. Editor SQL este, în general, accesibile prin intermediul Comandamentului Execute opţiune din meniul clic dreapta din nodul conectare (sau de noduri copil nod conexiune's). Acum, că sunteţi conectat la serverul de MySQL, puteţi crea o instanţă nouă bază de date utilizând Editorul SQL. În sensul acestui tutorial, va crea o instanţă numit MyNewDatabase: 1.

În fereastra Servicii, faceţi clic dreapta pe nodul MySQL Server şi alegeţi creez baza de date. Creaţi MySQL Bază de date deschide caseta de dialog.

2.

În Creare MySQL Bază de date caseta de dialog, tastaţi numele bazei de date noi. Vom folosi

MyNewDatabase pentru acest tutorial. Lasă caseta de selectare neselectată în acest moment.

82

Notă: Puteţi acorda, de asemenea, acces deplin la un utilizator dat. În mod implicit, numai utilizatorul admin are permisiunile pentru a efectua anumite comenzi. Drop jos listă vă permite să atribuiţi aceste permisiuni unui utilizator specificat. 3.

Faceţi clic pe OK. Bază de date nouă apare sub MySQL server nod în fereastra Servicii.

Crearea tabelele bazei de date Acum, că aţi conectat la MyNewDatabase, puteţi începe explorarea cum să creaţi tabele, popula-le cu date, şi modifica datele menţinută în tabele. Acest lucru vă permite să aruncaţi o privire mai atentă la funcţionalitatea oferite de Explorer Baza de date, precum şi un sprijin NetBeans IDE pentru fişiere SQL.

MyNewDatabase este în prezent gol. În IDE, este posibil să adăugaţi un tabel de baza de date, fie utilizând Crează masă de dialog, sau de către le-a introdus o interogare SQL şi rularea direct de la Editor SQL. Aici puteţi explora ambele metode: 1.

Utilizând Editorul de SQL

2.

Utilizarea Creaţi Table Dialog

Utilizând Editorul de SQL 1.

În baza de date Explorer, extindeţi nodul conexiune MyNewDatabase (

), Precum şi faptul

că există trei subfoldere: Mese, Vizualizari şi proceduri. Alegeţi Execute Command din dosarul tabelele din baza de date Explorer. O pânză-martor se deschide în Editor SQL în fereastra principală .. În NetBeans IDE 6.7 Beta, atunci când vă extindeţi-un nod în baza de date conexiune, noduri schemă apar mai multe. 2.

În editorul SQL, tastaţi în interogare de mai jos. Aceasta este o definiţie tabel pentru tabelul de

consilier care eşti pe cale de a crea. 3.

CREATE TABLE Consilier (

83

4.

SMALLINT id UNSIGNED NOT NULL AUTO_INCREMENT,

5.

VARCHAR Prenumele (50),

6.

VARCHAR nickname (50),

7.

VARCHAR NumeDeFamilie (50),

8.

de telefon VARCHAR (25),

9.

VARCHAR de e-mail (50),

10.

memberSince DATA DEFAULT '0000-00-00 ',

11.

PRIMARY KEY (id) ); Notă: Interogări format în Editorul SQL sunt analizat şi executat în Structured Query Language (SQL). SQL aderă la stricte reguli de sintaxă care ar trebui să fie familiarizat cu atunci când se lucrează într-un editor IDE lui. La execută o interogare, feedback-ul de la motorul de SQL este generat în fereastra de ieşire indică dacă execuţia a avut succes sau nu.

12. Pentru a executa interogarea, fie faceţi clic pe Run SQL (

), Buton pe bara de sarcini din

partea de sus (Ctrl-Shift-E), sau faceţi clic dreapta în cadrul Editor SQL şi alegeţi Run Declaratie. IDE genereaza tabelul de consilier în baza de date, şi primiţi un mesaj similar cu următorul în fereastra Output.

13. Pentru a verifica modificările, faceţi clic dreapta pe nodul tabelele din baza de date Explorer şi alegeţi Refresh. Actualizează Actualizează opţiune UI Explorer bazei de date componentă a stării actuale a bazei de date specificate. Reţineţi că nodul nou tabel Consilier (

) Afişează

acum în conformitate cu tabelele din baza de date explorer. Dacă vă extindeţi tabelul de nod puteţi vedea coloanele (câmpurile) le-aţi creat, incepand cu cheia primară (

).

Utilizarea Creaţi Table Dialog 1.

În baza de date Explorer, faceţi clic dreapta pe tabelele nodul şi alegeţi Crează masă. Crearea de dialog Tabelul se deschide.

2.

În domeniul numele tabelului de text Subiect tip,.

84

3.

În primul rând afişat, selectaţi caseta de cheie de selectare. Sunteti precizând cheie primară pentru masa ta. Toate tabelele găsite în baze de date relationale trebuie să conţină o cheie primară. Reţineţi că, atunci când selectaţi caseta de cheie de validare, Index şi casetele de selectare unice sunt, de asemenea, selectate automat şi caseta de selectare Null este deselectat. Acest lucru se datorează faptului că cheile primare sunt utilizate pentru a identifica un rând unic în baza de date, precum şi de forma implicit tabel index. Pentru ca toate rândurile trebuie să fie identificate, chei primare nu poate conţine o valoare Null.

4.

Pentru nume de coloană, introduceţi id. Pentru Tip de date, alegeţi SMALLINT din lista verticală, apoi faceţi clic pe butonul Add coloană.

5.

Repetaţi această procedură prin specificarea toate câmpurile rămase, după cum se arată în tabelul de mai jos.

6.

Cheie

Index

[verificat]

[verificat]

Nul

Unic

Numele Column

Tip de date

Măsură

Id

SMALLINT

0

[verificat]

nume

VARCHAR

50

[verificat]

Descrierea

VARCHAR

500

[verificat]

FK_counselorID

SMALLINT

0

[verificat]

Sunteti a crea un tabel numit Sub rezerva, care va deţine date pentru fiecare dintre următoarele înregistrări.

o

Nume: numele a subiectului

o

Descriere: descriere a obiectului

o

Consilier ID: consilier ID-ul care corespunde cu un ID din tabelul de Consilier

85

Asiguraţi-vă că dvs. Creaţi câmpurile din tabelul de dialog se potrivesc cu cele de mai sus, apoi faceţi clic pe OK. IDE generează tabel Subiect in baza de date, şi puteţi vedea un nod nou tabel Subiect (

) Imediat de afişare în conformitate cu tabelele din baza de date Explorer.

Lucrul cu tabelul de date În scopul de a lucra cu datele de masă, puteţi face uz de Editor SQL în NetBeans IDE. Prin rularea interogări SQL pe o bază de date, puteţi adăuga, modifica şi şterge datele menţinute în structuri de baza de date. Pentru a adăuga un nou record (RL) la tabel Consilier, faceţi următoarele: 1.

Alegeţi Execute Command din dosarul tabelele din baza de date Explorer. O pânză-martor se deschide în Editor SQL în fereastra principală.

2.

3.

În editorul SQL, tastaţi în interogare de mai jos.

INSERT INTO Consilier VALUES (1, 'Ricky "," "The Dragon" "," Steamboat', '334 612-5678 ',' [email protected] ', '1996-01-01')

4.

Pentru a executa interogarea, faceţi clic dreapta în cadrul Editor SQL şi alegeţi Run Declaratie. În fereastra de iesire, puteţi vedea un mesaj care indică faptul că interogarea a fost executat cu succes.

5.

Pentru a verifica faptul că nou record a fost adăugată la tabelul de consilier, în baza de date Explorer, faceţi clic dreapta pe tabelul de nodul Consilier şi alegeţi vizualizarea de date. Un nou SQL Editor panoul se deschide în fereastra principală. Când alegeţi vizualizarea de date, o interogare pentru a selecta toate datele din tabelul este generat automat în regiunea superioară a Editor SQL. Rezultatele declaraţie sunt afişate într-o vizualizare tabel în regiunea inferioară. În acest exemplu, afişează tabelul de consilier. Reţineţi că un rând nou a fost adăugat cu datele pe care tocmai aţi furnizat de interogare SQL.

Rularea unui script SQL O altă modalitate de a gestiona datele tabel, în NetBeans IDE este prin rularea unui script de externe, SQL direct în IDE. Dacă aţi creat un script de SQL în altă parte, aveţi posibilitatea să deschideţi pur şi simplu în NetBeans IDE şi a alerga it în Editorul de SQL. Pentru scopuri demonstrative, ifpwafcad.sql descărcaţi şi a salva it într-o locaţie de pe computer. Acest script creează două tabele similar cu ceea ce tocmai aţi creat de mai sus (Consilier şi sub rezerva), şi imediat le populează cu date.

86

Pentru ca script-ul suprascrie aceste tabele în cazul în care acestea există deja, a şterge Consilier şi tabele Subiect acum, astfel, devine evident că tabele noi sunt create atunci când rularea script-ului. Pentru a şterge tabele: 1.

Faceţi clic dreapta pe nodul selectat tabelul din baza de date Explorer şi alegeţi Delete.

2.

În Confirmare ştergeri obiect de dialog care se afişează, faceţi clic pe Da. Reţineţi că nodul de masă este în mod automat eliminat din baza de date Explorer. Notă: Puteţi şterge tabelul de mai mult decât înainte de acest Apare caseta de dialog.

Pentru a executa script-ul SQL pe MyNewDatabase: 1.

Alegeti File> Open File din meniul IDE principal. În browser-ul de fişiere naviga la locaţia unde aţi salvat anterior ifpwafcad.sql şi faceţi clic pe Open. Script-ul se deschide automat în Editorul de SQL.

2.

A face conexiunea la MyNewDatabase sigur că este selectat din meniul drop-down de conectare în bara de instrumente din partea de sus a editorului.

3.

Faceţi clic pe Run SQL (

), Buton pe task bar Editor SQL lui. Script-ul este executat

împotriva baza de date selectată, precum şi orice feedback-ul este generat în fereastra de iesire. 4.

Pentru a verifica modificările, faceţi clic dreapta pe nodul conexiunea MyNewDatabase în fereastra Durata şi alegeţi Refresh. Actualizează Actualizează opţiune UI Explorer bazei de date componentă a stării actuale a bazei de date specificate. Reţineţi că cele două tabele noi de la script-ul SQL acum o afişaţi ca noduri tabelul de la MyNewDatabase în Explorer baza de date.

5.

Alegeţi vizualizarea de date de la meniul clic dreapta a unui nod tabel selectat pentru a vedea datele conţinute în tabele noi. În acest mod, puteţi compara datele de tabel cu datele cuprinse în script-ul SQL pentru a vedea că ele se potrivesc.

87

MODULU VI. APPLET-uri Un applet reprezintă un program Java care gestionează o suprafaşă de afişare care poate fi încărcată în pagini de Web. Appleturile Java au extensia class şi se utilizează în general pentru a insera în pagini web aplicaţii, animaţii, jocuri etc. Diferenţa exenţială dintre o aplicaţie şi un applet este că un applet nu poate fi executat independent aşa cum rulează o aplicaţie, el va fi executat prin intermediul browserului în care este încarcata pagina Web ce contine appletul respectiv. O aplicatie independenta este executata prin apelul interpretorului java, având ca parametru numele clasei principale a aplicatiei, clasa principala fiind cea care contine metodă main. Ciclul de viata al unui applet este complet diferit, fiind dictat de evenimentele generate de către browser la vizualizarea documentului HTML ce contine appletul. Pachetul care ofera suport pentru crearea de appleturi este java.applet.Limbajul Java oferă clase dedicate acestor tipuri de aplicaţii cum ar fi: java.applet.Applet şi javax.swing.Japplet. Executia unui applet începe în momentul în care un browser afiseaza o pagina Web în care este inclus appletul respectiv. Etapele pentru încărcare a unui apllet în browser sunt: • Incarcarea in memorie – este realizata de o instanta a clasei principale a appletului şi încarcata în memorie; • Initializarea - apeleaza metodă init cere permite initializarea diverselor variabile, citirea unor parametri de intrare etc; • Pornirea - utilizeaza apelata metodă start; • Executia propriu-zisa - reprezinta interactiunea dintre utilizator şi componentele afisate pe suprafata appletului; • Oprirea temporara – daca utilizatorul paraseste pagina Web în care rulează appletul este apelata metodă stop a acestuia, oferindu-se astfel posibilitatea să se opreasca temporar cât timp nu este vizibil, pentru a nu consuma inutil din timpul procesorului. Acelasi lucru se întâmpla daca fereastra browserului este minimizata. In momentul când pagina Web ce contine appletul devine activa, se reapeleaza metodă start. • Oprirea definitiva - închiderea instantelor browserului folosit pentru vizualizare; appletul este eliminat din memorie şi va fi apelata metodă destroy a acestuia, pentru a-i permite să elibereze resursele detinute. Apelul metodei destroy este întotdeauna precedat de apelul lui stop. Metodele specifice appleturilor(init, start, stop şi destroy) sunt apelate automat de browser şi nu trebuiesc apelate explicit. teoretic, aceasta metodă ar trebui să se apeleze o singura data, la prima afisare a appletului în pagina, dar la unele browsere, este posibil ca ea să se apeleze de mai multe ori. start se folosescre imediat dupa initializare cat şi de fiecare data când appletul redevine activ, dupa o oprire temporara. când appletul nu mai este vizibil (pagina Web nu mai este vizibila, stop fereastra browserului este minimizata etc) dar şi înainte de metodă destroy. destroy se apeeaza la închiderea ultimei instante a browserului ce a încarcat în init

88

memorie clasa principala a appletului. Structura unui applet este import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class StructuraApplet extends Applet { public void init() { } public void start() { } public void stop() { } public void destroy() { } public void paint(Graphics g) { } }

Exemplu de fişier sursă care are extensia java şi reprezinta un applet. import java.applet.*; import java.awt.*; public class imagini extends Applet { private Image imagine; public void init() { imagine =getImage(getDocumentBase(), ‘‘i.jpg”); } public void paint(Graphics g) {boolean b=g.drawImage(imagine, 200,20,200,100,this); this.setBackground(Color.CYAN); g.drawString(”Aplicatie Applet”,200, 140); } }

În urma operaţiei de compilare rezultă fişierul cu extensia .class care este încarcat în pagina şi interpretat de browser. Vezi figura 5.1 şi 5.2.

89

Figura 5.1 Applet rulat în Netbeans

Figura 5.2 Applet încarcat în browser

Codul sursă al fişierului HTML este cel de mai jos. Fişierul a fost generat de către aplicaţia Netbeans, dar acesta putea să fie scris şi de către utilizator. Principalul element al acestui fişier este eticheta <APPLET codebase=‘‘classes” code=‘‘aa/imagini.class” width=350 height=200> care are tributele: codebase, code, with şi height. 90

<TITLE>Applet HTML Page


Applet HTML Page

<APPLET codebase=‘‘classes” code=‘‘aa/imagini.class” width=350 height=200>


Generated by NetBeans IDE

În figura 5.1 se poate observa pricipalele metode specifice unui Applet. Un applet nu poate să: • citească sau scrie documente pe calculatorul client; • deschidă conexiuni cu alte maşini , decât pe cea de pe care provine – host; • pornească programe încărcate pe maşina client • citeasca diverse proprietati ale sistemului de operare al clientului Exemplu de Applet care conţine 3 variabile a, b şi c ale căror valori vor fi transmise prin intermediu etichetei <param> folosită în carul etichetei <APPLET>. import java.applet.*; import java.awt.*; public class GetParam extends Applet { String a,b,c; public void init(){ if((a=getParameter(”arg1”))==null) a=‘‘nu exista aceste parametru a in documentul testat”; if((b=getParameter(”arg2”))==null) b=‘‘nu exista aceste parametru b in documentul testat”; if((c=getParameter(”arg3”))==null) c=‘‘nu exista aceste parametru c in documentul testat”; if((a=getParameter(”arg1”))==null) a=‘‘nu exista aceste parametru a in documentul testat”; } public void paint(Graphics g) { g.drawString(”a=‘‘+a,20,20); g.drawString(”b=‘‘+b,20,40); g.drawString(”c=‘‘+c,20,60); }} 91

Prin încarcarea în browser a fişierului .class rezultă imaginea din figura 5.3

Cosul sursă a fişierului HTML în care se transmit valorile paramentrilor este: <APPLET codebase=‘‘classes” code=‘‘GetParam.class” width=‘‘50%” height=‘‘50%”> <param name=‘‘arg1” value=‘‘primul parametru”> <param name=‘‘arg2” value=‘‘valoare 2”> <param name=‘‘arg3” value=‘‘valoare 3”> Aplicatii

Sa se testeze exemplele urmatoare, sa se personalizeze si apoi sa se explice cel putin 10 metode si proprietati folosite in realizarea acestora. Exemplu 1 import java.applet.Applet; import java.lang.*; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.*; public class listacomplexa extends Applet implements ActionListener{ private List lista; private Button buton; public void init() {lista=new List(3,true); lista.add("red"); lista.add("blue"); lista.add("green"); lista.add("yellow"); add(lista); buton=new Button("Afiseaza"); add(buton); buton.addActionListener(this);

92

} public void actionPerformed(ActionEvent e) {if(e.getSource()==buton) {String[] sel=lista.getSelectedItems(); String sir=" "; sir=sir+sel[0]+" "+sel[1]+" "+sel[2]; showStatus(sir); } } } Exemplu 2 import java.applet.Applet; import java.awt.*; import java.awt.event.*;

public class listasimpla extends Applet implements ItemListener{ private Choice lista; public void init() {lista=new Choice(); lista.add("red"); lista.add("green"); lista.add("blue"); add(lista); lista.addItemListener(this); } public void itemStateChanged(ItemEvent e) {if(e.getSource()==lista) {String selectat=e.getItem().toString(); showStatus("Starea"+" "+selectat); } } } Exemplu 3 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.Graphics; public class panza extends Applet { private Canvasnou canvas=new Canvasnou();

public void init() {canvas.setBackground(Color.gray); canvas.setSize(200,200); add(canvas); } 93

public class Canvasnou extends Canvas { public void paint(Graphics g) { g.drawString("mesaj",15,15);} } } Exemplu 4 import java.applet.Applet; import java.awt.event.ActionListener; import java.awt.event.*; import java.awt.*;

public class text extends Applet implements ActionListener{ private TextArea mesaj; private Button text,afisare; public void init(){ mesaj=new TextArea(5,5); add(mesaj); text=new Button("selectie"); add(text); text.addActionListener(this); afisare=new Button("afisare"); add(afisare); afisare.addActionListener(this); } public void actionPerformed(ActionEvent e) {if(e.getSource()==text){ String textselectat=mesaj.getSelectedText(); String sir="sirul selectat este"+textselectat; showStatus(sir); } if(e.getSource()==afisare){ String texttot=mesaj.getText(); String sir="sirul este"+texttot; showStatus(sir); } } Exemplu 5 package p1; import java.applet.Applet; import java.awt.Color; import java. awt.Graphics;

94

public class triunghi extends Applet{ public void paint (Graphics g) {g.setColor(Color.blue); deseneaza_triunghi(g,20,20,10,11); g.drawString("Aria este"+ aria_triunghi(10,11),30,30); g.setColor(Color.magenta); deseneaza_triunghi(g,100,100,60,70); g.drawString("Aria este"+ aria_triunghi(60,70),150,180); } private void deseneaza_triunghi(Graphics g, int bottomx, int bottomy, int baza, int inaltime) {int rightx = bottomx + baza; int topx = bottomx + baza/2; int topy = bottomy + inaltime; g.drawLine(bottomx, bottomy, rightx, bottomy); g.drawLine(rightx, bottomy, topx, topy); g.drawLine(topx, topy, bottomx, bottomy); } private void deseneaza_dreptunghi(Graphics g){ g.drawRect(10,10,30,30); } private float aria_triunghi(int baza, int inaltime) { float aria = (baza * inaltime)/2; return aria; } }

}

95

MODULUL VII. Aplicatii WEB implementate in Java Acest document vă va duce, prin bazele utilizării NetBeans IDE pentru a dezvolta aplicatii web. Acesta demonstrează cum să creaţi o simpla cerere de web, implementa-l la un server şi a vizualiza prezentarea sa într-un browser. Aplicatia foloseste o JavaServer Pages ™ (JSP) pagina să vă rog să introduceţi numele dumneavoastră. Apoi, foloseste o componenta JavaBeans ™ să persiste numele în cursul sesiunii HTTP, şi preia numele de ieşire de pe o pagină două JSP.



Configurarea unei aplicatii web de proiect



Crearea şi editarea fişierelor sursă Web Application

o

Crearea unui pachet Java şi o sursă Java File

o

Generarea reproducător şi Setter Metode

o

Editarea Implicit JavaServer Pagini File

o

Crearea unei pagini JavaServer fişier



Executaţi o aplicaţie Web de proiect



Rezolvarea problemelor



A se vedea de asemenea, Pentru a urma acest tutorial, aveţi nevoie de următoarele produse software şi resurse.

Software-ul sau de Resurse

Versiune Required

NetBeans IDE

6.5 sau 6.7 Java Version

Java Development Kit (JDK)

versiunea 6 sau versiunea 5

GlassFish server de aplicaţie sau Tomcat container servlet

V2 Versiunea 6.x

Note: Web şi Java EE de instalare vă permite să instalaţi opţional serverul de V2 GlassFish de cerere şi



Apache Tomcat containerul servlet 6.0.x. Trebuie să instalaţi unul dintre acestea să lucreze prin acest tutorial.



Pentru a profita de Java NetBeans IDE lui EE 5 capabilităţi, utilizaţi un server de aplicatii, care este în deplină conformitate cu Java EE 5 caietul de sarcini, cum ar fi GlassFish Application Server V2 UR2. Dacă utilizaţi un server diferit, consultaţi Notele de lansare şi de întrebări frecvente pentru problemele cunoscute şi de workarounds. Pentru informaţii detaliate despre serverele sprijinit şi Java Platform EE, a se vedea Notele de lansare.

96

Dacă aveţi nevoie pentru a compara proiectul cu o soluţie de lucru, puteţi descărca aplicaţia

• proba.

Configurarea unei aplicatii web de proiect 1.

Alege File> New Project (Ctrl-Shift-N) din meniul principal. Sub Categorii, selectaţi Java Web. În cadrul proiectelor, selectaţi aplicatii Web, apoi faceţi clic pe Next.

2.

În Pasul 2, introduceţi HelloWeb în caseta Denumirea proiectului de text.

3.

Specificaţi Locatia Proiectului la orice director de pe computer. În sensul acestui tutorial, acest director este denumită în continuare $ PROJECTHOME.

4.

(Opţional) Selectaţi Utilizare dedicate Pliant pentru stocarea caseta de selectare Bibliotecile şi specificaţi locaţia pentru bibliotecile folder. A se vedea Sharing Biblioteci de proiect pentru mai multe informaţii pe această opţiune.

5.

Faceţi clic pe Următorul. Selectaţi serverul la care doriţi să implementaţi cererea dumneavoastră. Doar serverele care sunt înregistrate cu IDE sunt listate. Reţineţi că calea Contextul (de exemplu, de pe server) devine / HelloWeb, care se bazează pe numele-aţi dat proiectul într-o pasul anterior.

6.

Selectaţi versiunea de Java EE doriţi să le utilizaţi cu aplicaţia dvs. şi faceţi clic pe Următorul.

7.

În panoul Cadrelor, faceţi clic pe Finish pentru a crea proiectului. IDE creează $ PROJECTHOME / HelloWeb dosarul de proiect. Folderul de proiect conţine toate sursele dumneavoastră şi a metadatelor proiectului, cum ar fi proiectului Ant construi script-ul. Proiectul HelloWeb se deschide în IDE. Pagina de bun venit, index.jsp, se deschide în Editor Sursa în fereastra principală. Puteţi vizualiza structura proiectului fişierul în fereastra Files (Ctrl-2), precum şi structura sa logică în fereastra Proiecte (Ctrl-1).

Crearea şi editarea fişierelor sursă Web Application Crearea şi editarea fişierelor sursă este funcţia cea mai importantă pe care IDE serveşte. La urma urmei, care este, probabil, ceea ce petrece cea mai mare dintr-o zi fac. IDE oferă o gamă largă de

97

instrumente care pot compliment orice dezvoltator stilul lui personal, indiferent dacă tu prefer la codul totul cu mâna sau doresc IDE pentru a genera bucăţi mari de cod pentru tu.

Crearea unui pachet Java şi o sursă Java File 1.

În fereastra Proiecte, extindeţi Pachetele nodul Source. Notă Pachetele Sursa nodul conţine doar un nod gol implicit de pachet.

2.

Faceţi clic dreapta pe Pachete Sursa nodul şi a alege nou> Java Class. NameHandler Introduceţi în caseta de text din clasa Numele şi org.mypackage.hello tastaţi în caseta Pachet combo. Faceţi clic pe Terminare. Observaţi că noul fişier NameHandler.java se deschide în Editorul Source.

3.

În editorul Sursa, declara o variabilă de coarde tastând următoarea linie în mod direct de mai jos declaraţia de clasă.

String name; 4.

Se adaugă următorul constructor la clasa:

NameHandler publice () 5.

Adăugaţi următoarea linie în NameHandler () constructor:

nume = null;

Generarea reproducător şi Setter Metode 1.

Faceţi clic dreapta pe câmpul nume în Editorul Sursa şi a alege Refactor> Domenii encapsulate. Chintesenţa Domenii de dialog se deschide, enumerând câmpului Nume. Observaţi că Vizibilitate Domenii "este în mod implicit setat la privat, şi vizibilitate evaluatorilor" la public, care indică faptul că modificatorul de acces pentru clasa declaraţie variabile, va fi specificat drept privat, în timp ce reproducător şi metode setter vor fi generate cu modificatori publice şi

private, respectiv. 2.

Faceţi clic pe Refactor. Reproducător şi metode de setter sunt generate pentru câmpul nume. Modificator pentru variabila de clasă este setat la privat, în timp ce reproducător şi metode de setter sunt generate cu modificatori publice. Clasa Java acum ar trebui să arate similar cu următorul.

3.

Pachetul org.mypackage.hello;

4. 5.

/ **

6.

*

7.

* @ Author nbuser

8.

* /

9. 10.

public class NameHandler (

11. 12.

Numele privat String;

13.

98

14.

/ ** Creează o nouă instanţă de NameHandler * /

15.

NameHandler publice () (

16. 17.

nume = null; )

18. 19.

getname public String () (

20.

Numele de returnare;

21.

)

22. 23.

setName public void (String nume) (

24. 25.

this.name = nume; )

26. )

Editarea Implicit JavaServer Pagini File 1.

Recentreze dosar index.jsp făcând clic pe tab-ul său afişate la partea de sus a Editor Source.

2.

În Palette (Ctrl-Shift-8) situat în partea dreaptă a Source Editor, extindeţi Formularele HTML şi trageţi un element Formular de până la un punct, după tag-uri

în Editorul de Source. Inserare formular afişează caseta de dialog.

3.

Specificaţi următoarele valori:

o

Acţiune: response.jsp

o

Metoda: GET

o

Nume: Formular de intrare Faceţi clic pe OK. Un formular HTML este adăugat la dosar index.jsp.

4.

Glisaţi un element de introducere a textului pentru un punct chiar înainte de tag-ul, apoi specificaţi următoarele valori:

99

o

Nume: Nume

o

Tip: text Faceţi clic pe OK. O HTML tag-ul, se adaugă între etichetele
.

5.

Glisaţi un element de buton la un punct chiar înainte de tag-ul. Specificaţi următoarele valori:

o

Label: OK

o

Tip: submit Faceţi clic pe OK. Un buton de HTML, se adaugă între etichetele .

6.

Tip Introduceţi numele dumneavoastră: chiar înainte de prima tag-ul, apoi modificaţi implicit Hello World! Textul dintre tag-uri

la intrarea pe formular.

7.

Format Faceţi clic dreapta pe cadrul Editor Sursa şi alegeţi (Alt-Shift-F), pentru a ordonat formatul codul dumneavoastră. Fişierul dvs. index.jsp ar trebui să apară acum similară cu următoarea:

8. 9. 10.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

11.

JSP Page </ title><br /> <br /> 12.<br /> <br /> </ head><br /> <br /> 13.<br /> <br /> <body><br /> <br /> 14.<br /> <br /> <h1> Formular de intrare </ h1><br /> <br /> 15. 16.<br /> <br /> <form Form" name="Name de intrare action="response.jsp"><br /> <br /> 17.<br /> <br /> Introduceţi numele dumneavoastră:<br /> <br /> 18.<br /> <br /> <input type="text" name="nume" /><br /> <br /> 19.<br /> <br /> <input type="submit" value="OK" /><br /> <br /> 20. 21.<br /> <br /> </ form> </ body> </ html><br /> <br /> Crearea unei pagini JavaServer fişier 1.<br /> <br /> În fereastra Proiecte, faceţi clic dreapta pe nodul de proiect HelloWeb şi a alege nou> JSP. Noua JSP expertul fişierul se deschide. Numele fişierului de răspuns, şi faceţi clic pe Terminare. Observaţi că un fişier response.jsp nod afişează în fereastra de Proiecte sub<br /> <br /> index.jsp, şi nou dosar se deschide în Editorul Sursa. 2.<br /> <br /> În paleta de la dreptul de Sursa Editor, extindeţi JSP şi glisaţi un element Utilizaţi Bean la un punct chiar sub tag-ul <body> în Editorul Source. Utilizarea de dialog Inserare Bean se deschide. Specificaţi valorile indicate în figura de mai jos.<br /> <br /> 100<br /> <br /> o<br /> <br /> ID: mybean<br /> <br /> o<br /> <br /> Clasa: org.mypackage.hello.NameHandler<br /> <br /> o<br /> <br /> Domeniul de aplicare: Session Faceţi clic pe OK. Observaţi că tag-ul <jsp:useBean> se adaugă sub tag-ul <body>.<br /> <br /> 3.<br /> <br /> Glisaţi un set de fasole element de proprietate de la paleta de la un punct chiar înainte de <h1> tag-ul şi faceţi clic pe OK. În tag-ul <jsp:setProperty> care apare, a º terge atributul gol<br /> <br /> valoarea şi modifică după cum urmează. <jsp:setProperty name="mybean" property="name" /> După cum se indică în documentaţia <jsp:setProperty>, aveţi posibilitatea să setaţi o valoare de proprietate în diferite moduri. În acest caz, datele introduse de utilizator care provin din index.jsp devine un nume / pereche valoare care este trecut la obiectul cererii. Când setaţi o proprietate utilizând tag-ul <jsp:setProperty>, puteţi specifica valoarea în funcţie de numele unei proprietăţi cuprinse în obiectul cererii. Prin urmare, prin stabilirea de<br /> <br /> proprietate pentru nume, puteţi recupera valoarea specificată de date introduse de utilizator. 4.<br /> <br /> Schimbaţi textul dintre tag-urile <h1> astfel încât aceasta să arată astfel:<br /> <br /> <h1> Bună ziua,! </ h1> 5.<br /> <br /> Glisaţi un element de fasole Ia imobiliare de la Palette şi drop după virgulă între etichetele<br /> <br /> <h1>. Specificaţi următoarele valori în Inserare Ia Bean de dialog de locatie:<br /> <br /> o<br /> <br /> Bean Nume: mybean<br /> <br /> o<br /> <br /> Domeniul imobilier Nume: Nume Faceţi clic pe OK. Observaţi că <jsp:getProperty> tag-ul este acum adaugă între etichetele<br /> <br /> <h1>. 6.<br /> <br /> Format Faceţi clic dreapta pe cadrul Editor Sursa şi alegeţi (Alt-Shift-F), pentru a ordonat formatul codul dumneavoastră. <body> Tag-uri de fişier dvs. response.jsp ar trebui să apară acum similară cu următoarea:<br /> <br /> 101<br /> <br /> 7. 8.<br /> <br /> <body> <jsp:useBean id="mybean" scope="session" class="org.mypackage.hello.NameHandler" /><br /> <br /> 9.<br /> <br /> <jsp:setProperty name="mybean" property="name" /><br /> <br /> 10.<br /> <br /> <h1> Bună ziua, <jsp:getProperty name="mybean" property="name" />! </ h1> </ body><br /> <br /> Executaţi o aplicaţie Web de proiect IDE foloseste o furnică construi script pentru a construi şi rula aplicaţii web dumneavoastră. IDE genereaza construi script-ul functie de optiunile pe care le specificaţi în expertul New Proiectului, precum şi cele de la Proiectul proiectului caseta de dialog Proprietăţi (În fereastra de Proiecte, alegeti Properties din meniul nodul proiectului click dreapta). 1.<br /> <br /> În fereastra Proiecte, faceţi clic dreapta pe nodul de proiect HelloWeb şi alegeţi Run (F6). Notă: În mod implicit, proiectul a fost creat cu compilaţi pe caracteristica Salvare activat, deci nu este nevoie de a compila codul primul dvs. pentru a rula aplicaţia în IDE. Pentru mai multe informaţii despre caracteristica compilaţi pe Salvare, a se vedea compilaţi pe Salvare secţiune a Crearea, Importul, şi Configurarea Java Ghid de Proiecte. Pagina index.jsp se deschide în browser-ul implicit dvs.<br /> <br /> 2.<br /> <br /> Introduceţi numele dumneavoastră în caseta de text, apoi faceţi clic pe OK. Afişează<br /> <br /> response.jsp pagină, oferindu-vă cu un salut simplu.<br /> <br /> Notă: Aplicaţia ilustrate mai sus dislocaţi la Web Tomcat Server. Dacă v-aţi înregistrat şi selectat un alt server ţintă în schimb, nu veţi avea un fişier META-INF/context.xml. De exemplu, dacă serverul dvs. este GlassFish, veţi avea un fişier WEB-INF/sun-web.xml ca descriptor de desfăşurare dumneavoastră.<br /> <br /> 102<br /> <br /> MODULUL VIII. ALTE APLICATII 1. Se citeste numarul zilei si se afiseaza ziua corespunzatoare<br /> <br /> * ProiectZiuaFrame.java * */ package my.ProiectZiua; /** * * @author profesor */ public class ProiectZiuaFrame extends javax.swing.JFrame { /** Creates new form ProiectZiuaFrame */ public ProiectZiuaFrame() { initComponents(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); jTextField2 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton();<br /> <br /> 103<br /> <br /> setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLO SE); jLabel1.setText(" Ziua saptamanii (cifre)"); jTextField1.setText("jTextField1"); jLabel2.setText("Ziua saptamanii (litere) "); jTextField2.setText("jTextField2"); jButton1.setText("Transformare"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jButton2.setText("Clear"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jButton3.setText("Exit"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADIN G) .addGroup(layout.createSequentialGroup() .addGap(32, 32, 32) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.TRAILING) .addComponent(jButton3) 104<br /> <br /> .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.LEADING, false) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.TRAILING, false) .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE)) .addGap(43, 43, 43) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.LEADING, false) .addComponent(jTextField2) .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 164, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup() .addGap(61, 61, 61) .addComponent(jButton1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELAT ED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jButton2)))) .addContainerGap(19, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADIN G) .addGroup(layout.createSequentialGroup() .addGap(37, 37, 37) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.BASELINE) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel1)) .addGap(33, 33, 33)<br /> <br /> 105<br /> <br /> .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.TRAILING) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2)) .addGap(45, 45, 45) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.BASELINE) .addComponent(jButton1) .addComponent(jButton2)) .addGap(46, 46, 46) .addComponent(jButton3) .addContainerGap(39, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int nrZi; nrZi=Integer.parseInt(jTextField1.getText()); switch(nrZi) { case 1: jTextField2.setText("Luni"); break; case 2: jTextField2.setText("Marti"); break; case 3: jTextField2.setText("Miercuri"); break; case 4: jTextField2.setText("Joi"); break; case 5: jTextField2.setText("Vineri"); break; case 6: jTextField2.setText("Sambata"); break; case 7: jTextField2.setText("Duminica"); break; default: jTextField2.setText("Nu ati dat o zi a saptamanii valida! (17)"); break; } } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { jTextField1.setText(""); jTextField2.setText(""); } private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); 106<br /> <br /> } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new ProiectZiuaFrame().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; // End of variables declaration } 2. O aplicatie de tip calculator<br /> <br /> /* * Calculator.java * public class Calculator extends javax.swing.JFrame { 107<br /> <br /> /** Creates new form Calculator */ public Calculator() { initComponents(); } private void initComponents() { jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jButton4 = new javax.swing.JButton(); jButton5 = new javax.swing.JButton(); jButton6 = new javax.swing.JButton(); jButton7 = new javax.swing.JButton(); jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jTextField3 = new javax.swing.JTextField(); jTextField2 = new javax.swing.JTextField(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLO SE); jButton1.setText("+"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jButton2.setText("-"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jButton3.setText("*"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); 108<br /> <br /> jButton4.setText("/"); jButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton4ActionPerformed(evt); } }); jButton5.setText("^"); jButton5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton5ActionPerformed(evt); } }); jButton6.setText("Clear"); jButton6.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton6ActionPerformed(evt); } }); jButton7.setText("Exit"); jButton7.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton7ActionPerformed(evt); } }); jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Calcula tor")); jLabel1.setText("Nr 1"); jLabel2.setText("Nr 2"); jLabel3.setText("Rezultat"); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment. LEADING) .addGroup(jPanel1Layout.createSequentialGroup() 109<br /> <br /> .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout. Alignment.TRAILING) .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE) .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE) .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELAT ED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout. Alignment.LEADING) .addComponent(jTextField3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jTextField1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 239, Short.MAX_VALUE) .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 239, Short.MAX_VALUE)) .addContainerGap()) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment. LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(22, 22, 22) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout. Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(20, 20, 20) 110<br /> <br /> .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout. Alignment.BASELINE) .addComponent(jLabel2) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(27, 27, 27) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout. Alignment.BASELINE) .addComponent(jLabel3) .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(35, Short.MAX_VALUE)) ); jPanel1.getAccessibleContext().setAccessibleName("Calculator"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADIN G) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGap(21, 21, 21) .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(17, 17, 17) 111<br /> <br /> .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.TRAILING, false) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jButton6) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELAT ED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jButton7)) .addGroup(layout.createSequentialGroup() .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(25, 25, 25) .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(21, 21, 21) .addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(16, 16, 16) .addComponent(jButton5))))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADIN G) .addGroup(layout.createSequentialGroup() .addGap(19, 19, 19) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(26, 26, 26) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.BASELINE) .addComponent(jButton1) .addComponent(jButton2) .addComponent(jButton3) 112<br /> <br /> .addComponent(jButton5) .addComponent(jButton4)) .addGap(29, 29, 29) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.LEADING, false) .addComponent(jButton7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jButton6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(29, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) { float nr1,nr2,rezultat; nr1=Float.parseFloat(jTextField1.getText()); nr2=Float.parseFloat(jTextField2.getText()); rezultat=1; for(int i=1;i<=nr2;i++) rezultat=rezultat*nr1; jTextField3.setText(String.valueOf(rezultat));<br /> <br /> } private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { float nr1,nr2,rezultat; nr1=Float.parseFloat(jTextField1.getText()); nr2=Float.parseFloat(jTextField2.getText()); rezultat=nr1/nr2; jTextField3.setText(String.valueOf(rezultat)); } private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { float nr1,nr2,rezultat; nr1=Float.parseFloat(jTextField1.getText()); nr2=Float.parseFloat(jTextField2.getText()); rezultat=nr1*nr2; jTextField3.setText(String.valueOf(rezultat)); } 113<br /> <br /> private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { float nr1,nr2,rezultat; nr1=Float.parseFloat(jTextField1.getText()); nr2=Float.parseFloat(jTextField2.getText()); rezultat=nr1-nr2; jTextField3.setText(String.valueOf(rezultat)); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { float nr1,nr2,rezultat; nr1=Float.parseFloat(jTextField1.getText()); nr2=Float.parseFloat(jTextField2.getText()); rezultat=nr1+nr2; jTextField3.setText(String.valueOf(rezultat)); } private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) { jTextField1.setText(""); jTextField2.setText(""); jTextField3.setText(""); } private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Calculator().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; 114<br /> <br /> private javax.swing.JButton jButton4; private javax.swing.JButton jButton5; private javax.swing.JButton jButton6; private javax.swing.JButton jButton7; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JPanel jPanel1; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; private javax.swing.JTextField jTextField3; // End of variables declaration }<br /> <br /> 3. Aplicatie de convertire grade Celsius in Fahrenheight<br /> <br /> /* * ConvertorUI.java * package my.Convertor; public class ConvertorUI extends javax.swing.JFrame { /** Creates new form ConvertorUI */ public ConvertorUI() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> 115<br /> <br /> private void initComponents() { jTextField1 = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLO SE); setTitle("Celsius Convertor_Lupoaie"); jTextField1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jTextField1ActionPerformed(evt); } }); jLabel1.setText("Celsius"); jButton1.setText("Convert"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jLabel2.setText("Fahrenheight"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADIN G) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.LEADING, false) .addComponent(jTextField1) .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(26, 26, 26) 116<br /> <br /> .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.LEADING) .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE) .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADIN G) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.BASELINE) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel1)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELAT ED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignme nt.BASELINE) .addComponent(jButton1) .addComponent(jLabel2)) .addContainerGap(76, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int temp; temp=(int)(Double.parseDouble(jTextField1.getText())*1.8+32); jLabel2.setText(temp+" Fahrenheit"); 117<br /> <br /> } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new ConvertorUI().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JTextField jTextField1; // End of variables declaration }<br /> <br /> 118<br /> <br /> 4. Scrieti setul de comenzi pentru realizarea unei ferestre de dimensiune 300, 100 care va arata ca in figura alaturata.<br /> <br /> import javax.swing.*; import java.awt.*; public class a1 { public static void main(String[] args) { JFrame f = new JFrame("Implementarea Inteferetelor Grafice"); JButton b1 = new JButton("1"); JButton b2 = new JButton("2"); JButton b3 = new JButton("3"); JButton b4 = new JButton("4"); JButton b5 = new JButton("5"); Container cp = f.getContentPane(); cp.setLayout(new FlowLayout()); cp.add(b1); cp.add(b2); cp.add(b3); cp.add(b4); cp.add(b5); f.setSize(300, 100); f.setVisible(true); } } 5. Scrieţi setul de comenzi pentru realizarea unei aplicaţii Java care va creea o fereastră ca cea din figura alăturată. Explicaţi instrucţiunile folosite pentru definirea elementelor JButton şi JRadioButton<br /> <br /> import javax.swing.*; import java.awt.*; import java.awt.event.*; class Butoane extends JPanel { public Butoane() { JButton b1 = new JButton("Seria A"); JButton b2 = new JButton("Seria B"); this.setLayout(new GridLayout(1,0)); add(b1); add(b2); } } class ButoaneRadio extends JPanel { public ButoaneRadio() { // Creare radio butoane<br /> <br /> 119<br /> <br /> JRadioButton butonAlb = new JRadioButton("Sambata 10-18"); // butonAlb.setSelected(true); JRadioButton butonRosu = new JRadioButton("Duminica 10-18"); // Gruparea butoanelor ButtonGroup group = new ButtonGroup(); group.add(butonAlb); group.add(butonRosu); // Adaugarea butoanelor add(butonAlb); add(butonRosu); } } public class Desen_Aplicatie extends JFrame { public static void main(String args[]) { Desen_Aplicatie app = new Desen_Aplicatie(); Butoane panouButoane = new Butoane(); ButoaneRadio panouButoaneRadio = new ButoaneRadio(); JPanel panou = new JPanel(); panou.add(panouButoane); panou.add(panouButoaneRadio); app.getContentPane().add(panou); app.pack(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); app.show(); } } 6. Problema propusa: sa se realizeze interfata de mai jos si sa se scrie actiunile corespunzatoare butoanelor din aceasta.<br /> <br /> 120<br /> <br /> EXEMPLE DE ACTIUNI PE UN BUTON float nr1,nr2,rezultat; nr1=Float.parseFloat(jTextField1.getText()); nr2=Float.parseFloat(jTextField2.getText()); rezultat=nr1+nr2; jTextField3.setText(String.valueOf(rezultat)); jTextField1.setText(""); jTextField2.setText(""); jTextField3.setText("");<br /> <br /> int temp; temp=(int)(Double.parseDouble(jTextField1.getText())*1.8+32); jLabel2.setText(temp+" Fahrenheit"); System.exit(0); int nrZi; nrZi=Integer.parseInt(jTextField1.getText()); switch(nrZi) { case 1: jTextField2.setText("Luni"); break; case 2: jTextField2.setText("Marti"); break; case 3: jTextField2.setText("Miercuri"); break; case 4: jTextField2.setText("Joi"); break; case 5: jTextField2.setText("Vineri"); break; case 6: jTextField2.setText("Sambata"); break; case 7: jTextField2.setText("Duminica"); break; default: jTextField2.setText("Nu ati dat o zi a saptamanii valida! (17)"); break; }<br /> <br /> 121<br /> <br /> Bibliografie 1. Stefan Tanasa, Cristian Olaru, Stefan Andrei, "Java de la 0 la expert", Editura Polirom, 2003 2. Jim Keogh – Java fara mistere, Ed Rosetti Educational, 2004 3. Ştefan Tănasă, Cristian Olaru, Ştefan Andrei – Java de la 0 la expert, Polirom, 2003 4. The SWING Tutorial (http://java.sun.com/docs/books/tutorial/uiswing/) 5. Matthew Robinson, Pavel Vorobiev - Swing, Second Edition, Manning, 1999 6. David M. Geary - Graphic Java 2, Prentice Hall, 2000 7. www.netbeans.org 8. www.sun.com 9. http://java.sun.com/docs/books/tutorial/getStarted/cupojava/netbea ns.html 10. http://www.roseindia.net/java/example/java/swing/graphics2D/creat e-animation.shtml 11. http://java.sun.com/docs/books/tutorial/uiswing/examples/compone nts/index.html<br /> <br /> 122<br /> <br /> Nota finală care se va acorda fiecărui student va conţine următoarele componente în procentele menţionate: - colocviu final 60% - lucrari practice/ proiect, etc. 20% -teste pe parcursul semestrului 10% -teme de control 10% Conditia de participare la colocviu, este ca fiecare student, sa realizeze un “PROJECT” care va cuprinde minim 15 aplicatii practice, selectate din cele 8 module ale suportului de curs. Aplicatiile vor fi “comentate” si eventual personalizate. Model bilet examen:<br /> <br /> 123<br /> <br /> Exemplu 1 1. Caracterizati pachetul JDK(1 pct). 2. Caracterizaţi structura de clase care fac parte din pachetul Swing (1 pct). 3. Enumeraţi principalele componentele Swing definite in pachetul javax.swing.* şi explicaţi rolul acestora (1 pct) 4. Care sunt clasele din Swing utilizate pentru definirea ferestrelor şi ce rol au acestea (1 pct)? 5. Scrieti setul de comenzi pentru realizarea unei ferestre de dimensiune 300, 150 care va arata ca in figura alaturata (1pct).<br /> <br /> 6. Definiţi noţiunea de Clasa (class) în Java şi explicaţi elementele care apar în cadrul acesteia (0,5 pct). 7. Definiţi noţiunea de Interfaţă (interface) în Java şi explicaţi elementele care apar în cadrul acesteia (0,5 pct). 8. Presupunând ca am proiectat o interfaţă ca în figura alăturată, scrieţi setul de comenzi corespunzatoare butoanelor din figura, ştiind ca a, b şi c sunt de tip real. Butonul Clear va avea rolul de a anula valorile din casetele de text, iar butonul Exit va inchide fereastra(3 pct).<br /> <br /> 124<br /> <br /> Exemplu 2 1. Definiţi noţiunea de Interfaţă (interface) în Java şi explicaţi elementele care apar în cadrul acesteia (1 pct). 2. Explicaţi rolul metodelor setSize, setResizeable, setTitle, setLocation, setVisible pentru ferestrele de tip JFrame cât şi semnificaţia parametrilor (1 pct). 3. Enumeraţi principalele componentele Swing definite in pachetul javax.swing.* şi explicaţi rolul acestora (1 pct) 4. Scrieti setul de comenzi prin care se realizeaza conectarea la baza de date produse si apoi se defineste tabela produs cu structura: cod_p (intreg si cheie primara), denumire_produs(text 40), furnizor (text 30), data_fabricatiei (data calendaristica) si pret_produs (intreg 5). (1.5 pct). 5. Scrieti setul de comenzi pentru butonul „Covert” – ce are rolul de a transforma grade Celsius (preluate intr-un JTextField) in grade Fahrenheight, rezultatul conversiei afisandu-se intr-o eticheta (Jlabel) (1.5pct).<br /> <br /> 6. 7. Presupunând ca am proiectat o interfaţă ca în figura alăturată, scrieţi setul de comenzi corespunzatoare butoanelor din figura, ştiind ca l1,l2,l3 şi nr 4 sunt de tip real. Butonul clear va avea rolul de a anula valorile din casetele de text, iar butonul close va inchide fereastra(3 pct).<br /> <br /> 125 </div> </div> <hr /> <h4>Related Documents</h4> <div class="row"> <div class="col-lg-2 col-md-4 col-sm-6 col-6"> <div class="card item-doc mb-4"> <a href="https://pdfcoke.com/documents/proiectare-interfete-grafice-1wovp66gv6ol" class="d-block"><img class="card-img-top" src="https://pdfcoke.com/img/crop/300x300/1wovp66gv6ol.jpg" alt=""/></a> <div class="card-body text-left"> <h5 class="card-title"><a href="https://pdfcoke.com/documents/proiectare-interfete-grafice-1wovp66gv6ol" class="text-dark">Proiectare Interfete Grafice</a></h5> <small class="text-muted float-left"><i class="fas fa-clock"></i> June 2020</small> <small class="text-muted float-right"><i class="fas fa-eye"></i> 6</small> <div class="clearfix"></div> </div> </div> </div> <div class="col-lg-2 col-md-4 col-sm-6 col-6"> <div class="card item-doc mb-4"> <a href="https://pdfcoke.com/documents/proiectare-autooo-j6o4lvl6y6zx" class="d-block"><img class="card-img-top" src="https://pdfcoke.com/img/crop/300x300/j6o4lvl6y6zx.jpg" alt=""/></a> <div class="card-body text-left"> <h5 class="card-title"><a href="https://pdfcoke.com/documents/proiectare-autooo-j6o4lvl6y6zx" class="text-dark">Proiectare Autooo</a></h5> <small class="text-muted float-left"><i class="fas fa-clock"></i> June 2020</small> <small class="text-muted float-right"><i class="fas fa-eye"></i> 9</small> <div class="clearfix"></div> </div> </div> </div> <div class="col-lg-2 col-md-4 col-sm-6 col-6"> <div class="card item-doc mb-4"> <a href="https://pdfcoke.com/documents/proiectare-curriculara-4d378lxwkkzx" class="d-block"><img class="card-img-top" src="https://pdfcoke.com/img/crop/300x300/4d378lxwkkzx.jpg" alt=""/></a> <div class="card-body text-left"> <h5 class="card-title"><a href="https://pdfcoke.com/documents/proiectare-curriculara-4d378lxwkkzx" class="text-dark">Proiectare Curriculara</a></h5> <small class="text-muted float-left"><i class="fas fa-clock"></i> June 2020</small> <small class="text-muted float-right"><i class="fas fa-eye"></i> 12</small> <div class="clearfix"></div> </div> </div> </div> <div class="col-lg-2 col-md-4 col-sm-6 col-6"> <div class="card item-doc mb-4"> <a href="https://pdfcoke.com/documents/teste-proiectare-g0ox0w4pvo6q" class="d-block"><img class="card-img-top" src="https://pdfcoke.com/img/crop/300x300/g0ox0w4pvo6q.jpg" alt=""/></a> <div class="card-body text-left"> <h5 class="card-title"><a href="https://pdfcoke.com/documents/teste-proiectare-g0ox0w4pvo6q" class="text-dark">Teste Proiectare</a></h5> <small class="text-muted float-left"><i class="fas fa-clock"></i> November 2019</small> <small class="text-muted float-right"><i class="fas fa-eye"></i> 22</small> <div class="clearfix"></div> </div> </div> </div> <div class="col-lg-2 col-md-4 col-sm-6 col-6"> <div class="card item-doc mb-4"> <a href="https://pdfcoke.com/documents/grafice-de-fct-exemple-p5on6e2qr83e" class="d-block"><img class="card-img-top" src="https://pdfcoke.com/img/crop/300x300/p5on6e2qr83e.jpg" alt=""/></a> <div class="card-body text-left"> <h5 class="card-title"><a href="https://pdfcoke.com/documents/grafice-de-fct-exemple-p5on6e2qr83e" class="text-dark">Grafice De Fct Exemple</a></h5> <small class="text-muted float-left"><i class="fas fa-clock"></i> May 2020</small> <small class="text-muted float-right"><i class="fas fa-eye"></i> 13</small> <div class="clearfix"></div> </div> </div> </div> <div class="col-lg-2 col-md-4 col-sm-6 col-6"> <div class="card item-doc mb-4"> <a href="https://pdfcoke.com/documents/compozitii-de-elemente-grafice-v8z1n7lnenor" class="d-block"><img class="card-img-top" src="https://pdfcoke.com/img/crop/300x300/v8z1n7lnenor.jpg" alt=""/></a> <div class="card-body text-left"> <h5 class="card-title"><a href="https://pdfcoke.com/documents/compozitii-de-elemente-grafice-v8z1n7lnenor" class="text-dark">Compozitii De Elemente Grafice</a></h5> <small class="text-muted float-left"><i class="fas fa-clock"></i> July 2020</small> <small class="text-muted float-right"><i class="fas fa-eye"></i> 12</small> <div class="clearfix"></div> </div> </div> </div> </div> </div> </div> </div> </div> <footer class="footer pt-5 pb-0 pb-md-5 bg-primary text-white"> <div class="container"> <div class="row"> <div class="col-md-3 mb-3 mb-sm-0"> <h5 class="text-white font-weight-bold mb-4">Our Company</h5> <ul class="list-unstyled"> <li><i class="fas fa-location-arrow"></i> 3486 Boone Street, Corpus Christi, TX 78476</li> <li><i class="fas fa-phone"></i> +1361-285-4971</li> <li><i class="fas fa-envelope"></i> <a href="mailto:info@pdfcoke.com" class="text-white">info@pdfcoke.com</a></li> </ul> </div> <div class="col-md-3 mb-3 mb-sm-0"> <h5 class="text-white font-weight-bold mb-4">Quick Links</h5> <ul class="list-unstyled"> <li><a href="https://pdfcoke.com/about" class="text-white">About</a></li> <li><a href="https://pdfcoke.com/contact" class="text-white">Contact</a></li> <li><a href="https://pdfcoke.com/help" class="text-white">Help / FAQ</a></li> <li><a href="https://pdfcoke.com/account" class="text-white">Account</a></li> </ul> </div> <div class="col-md-3 mb-3 mb-sm-0"> <h5 class="text-white font-weight-bold mb-4">Legal</h5> <ul class="list-unstyled"> <li><a href="https://pdfcoke.com/tos" class="text-white">Terms of Service</a></li> <li><a href="https://pdfcoke.com/privacy-policy" class="text-white">Privacy Policy</a></li> <li><a href="https://pdfcoke.com/cookie-policy" class="text-white">Cookie Policy</a></li> <li><a href="https://pdfcoke.com/disclaimer" class="text-white">Disclaimer</a></li> </ul> </div> <div class="col-md-3 mb-3 mb-sm-0"> <h5 class="text-white font-weight-bold mb-4">Follow Us</h5> <ul class="list-unstyled list-inline list-social"> <li class="list-inline-item"><a href="#" class="text-white" target="_blank"><i class="fab fa-facebook-f"></i></a></li> <li class="list-inline-item"><a href="#" class="text-white" target="_blank"><i class="fab fa-twitter"></i></a></li> <li class="list-inline-item"><a href="#" class="text-white" target="_blank"><i class="fab fa-linkedin"></i></a></li> <li class="list-inline-item"><a href="#" class="text-white" target="_blank"><i class="fab fa-instagram"></i></a></li> </ul> <h5 class="text-white font-weight-bold mb-4">Mobile Apps</h5> <ul class="list-unstyled "> <li><a href="#" class="bb-alert" data-msg="IOS app is not available yet! Please try again later!"><img src="https://pdfcoke.com/static/images/app-store-badge.svg" height="45" /></a></li> <li><a href="#" class="bb-alert" data-msg="ANDROID app is not available yet! Please try again later!"><img style="margin-left: -10px;" src="https://pdfcoke.com/static/images/google-play-badge.png" height="60" /></a></li> </ul> </div> </div> </div> </footer> <div class="footer-copyright border-top pt-4 pb-2 bg-primary text-white"> <div class="container"> <p>Copyright © 2024 PDFCOKE.</p> </div> </div> <script src="https://pdfcoke.com/static/javascripts/jquery.min.js"></script> <script src="https://pdfcoke.com/static/javascripts/popper.min.js"></script> <script src="https://pdfcoke.com/static/javascripts/bootstrap.min.js"></script> <script src="https://pdfcoke.com/static/javascripts/bootbox.all.min.js"></script> <script src="https://pdfcoke.com/static/javascripts/filepond.js"></script> <script src="https://pdfcoke.com/static/javascripts/main.js?v=1732360265"></script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-144986120-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-144986120-1'); </script> </body> </html>