Swing (Java)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Exemplu de interfață grafică Swing. Redarea fontului poate varia în funcție de platforma utilizată.

Swing este un cadru pentru Java , aparținând Java Foundation Classes (JFC) și orientat spre dezvoltarea de interfețe grafice . O parte din clasele de cadru Swing sunt implementări de widget-uri (obiecte grafice), cum ar fi casete de text, butoane, panouri și tabele.

Biblioteca Swing este utilizată ca bibliotecă oficială pentru crearea de interfețe grafice în Java. Este o extensie a setului de instrumente pentru fereastra abstractă anterioară. Principala diferență dintre cele două este că componentele Swing sunt scrise complet în cod Java .

Istorie

Internet Foundation Classes (IFC) a fost o bibliotecă grafică pentru Java dezvoltată inițial de Netscape Communications Corporation și lansată pentru prima dată pe 16 decembrie 1996 .

La 2 aprilie 1997 , Sun Microsystems și Netscape Communications Corporation și-au anunțat intenția de a combina IFC cu alte tehnologii pentru a crea clasele Java Foundation . În plus față de componentele furnizate inițial de IFC, Swing a introdus un mecanism care a permis modificarea aspectului fiecărei componente a unei aplicații fără a fi nevoie să aducă modificări semnificative codului sursă . Introducerea suportului plug-in look and feel a permis componentelor Swing să imite aspectul componentelor native, menținând în același timp avantajul de a fi independente de platformă. Această caracteristică face foarte ușor să aveți un aspect individual al aplicației care arată semnificativ diferit de celelalte programe native.

Distribuit inițial ca o bibliotecă descărcabilă separat, Swing a fost inclus ca parte a Java Standard Edition încă din versiunea 1.2. Clasele Swing sunt conținute în ierarhia pachetelor .

Arhitectură

Swing este o bibliotecă

  • platformă independentă
  • orientată spre componente
  • extensibil
  • editabil
  • configurabil
  • slab-cuplat ( slab cuplat )
  • ușoară
  • a expedia evenimentele
  • un cadru GUI MVC
  • cu un singur fir
Platforma independenta
Swing este independent de platformă atât în ​​ceea ce privește limbajul (Java), cât și implementarea acestuia (o redare universală și non-nativă a widgeturilor ).
Extensibil
diferitele părți ale bibliotecii Swing se bazează pe anumite interfețe și sunt conectate în așa fel încât să permită andocarea ușoară a diferitelor implementări ale acestor interfețe. Programatorul poate crea o implementare personalizată a acestor interfețe sau poate utiliza versiunile implicite.
Orientat pe componente
Swing este un cadru bazat pe componente. O componentă este un obiect cu anumite caracteristici comportamentale cunoscute și specificate. Obiectele Swing emit evenimente asincron, au caracteristici legate de ele și răspund dintr-un set specific de comenzi (specifice fiecărei componente). În special, componentele Swing Java Beans respectă specificațiile arhitecturii JavaBean .
Editabil
aplicația este capabilă să obțină un control precis al redării componentelor cu care este creată interfața grafică. Reprezentarea grafică a unei componente swing este dată de o combinație a unui set standard de elemente; în special, fiecărei componente i se încredințează proiectarea marginilor, adânciturilor, decorațiunilor etc. De obicei, utilizatorii modifică o componentă Swing standard (cum ar fi un tabel JT ) prin atribuirea anumitor chenare, culori, fundaluri ca proprietăți ale componentelor. Componenta va utiliza aceste proprietăți atunci când se desenează singură.
Configurabil
Swing, folosind intens mecanismele de rulare și căile de redare indirecte, are capacitatea de a modifica chiar și modificările fundamentale ale setărilor sale în timpul rulării. De exemplu, o aplicație bazată pe Swing își poate schimba aspectul în timpul rulării (de exemplu, de la aspectul MacOS la cel al Windows XP ). În plus, utilizatorii pot furniza propriile implementări ale aspectului, ceea ce permite schimbări ușoare ale aspectului aplicațiilor Swing existente, fără a fi nevoie să modificați în profunzime codul sursă al aplicației.
Ușoară
Configurabilitatea Swing se datorează, de asemenea, faptului că nu este nevoie să utilizeze comenzile GUI native ale OS pentru reprezentare , ci mai degrabă „desenează” comenzile sale constant, prin utilizarea API-ului 2D al Java. În plus, o componentă Swing nu trebuie neapărat să fie plătită în setul de componente native ale sistemului de operare, iar acest lucru înseamnă că este posibil să se creeze componente cu libertate maximă, exploatând la discreția dvs. potențialul pus la dispoziție de grafica Java 2D biblioteci.
Cuplat slab / MVC
Biblioteca Swing folosește intens modelul de proiectare Model / View / Controller , care conceptual decuplează datele afișate și controalele interfeței cu utilizatorul prin care este afișat. Datorită acestui fapt, majoritatea componentelor Swing au șabloane asociate (specificate în termeni de interfețe Java), programatorul poate folosi diferite implementări implicite sau poate crea propriile sale. Cadrul oferă implementări implicite ale șabloanelor de interfață pentru toate componentele sale.

De obicei, obiectele model Swing component sunt responsabile pentru furnizarea unei interfețe concise pentru definirea evenimentelor emise, precum și a proprietăților accesibile pentru modelul de date pentru utilizarea cu JComponents asociate. Având în vedere că modelul de dezvoltare MVC este o cale cuplată liber de obiecte legate de colaborare, modelul oferă modalitățile obișnuite de a crea ascultători de evenimente pentru obiecte model de date . De obicei, aceste evenimente sunt centrate pe model (de exemplu: inserarea de rânduri într-un model de tabel) și sunt mapate de specializarea componentului JC într-un eveniment specific pentru componenta GUI.

De exemplu, JTable are un model numit TableModel care descrie o interfață pentru modul în care un tabel ar trebui să acceseze datele. O implementare implicită a acestuia funcționează pe o matrice bidimensională.

Componenta vizuală a unui JComponent Swing este obiectul folosit pentru a „reprezenta” grafic controlul conceptual GUI. O diferențiere a Swing, ca cadru GUI, este utilizarea sa pe reprezentarea continuă a controalelor GUI (spre deosebire de utilizarea componentelor native OS gui). Această distincție este o sursă de complicații atunci când amestecăm controale AWT, care utilizează controale native, cu controale Swing într-o GUI.

Trebuie remarcat faptul că utilizarea tipică a cadrului Swing nu necesită crearea de modele modificate, deoarece cadrul oferă un set de implementări implicite care sunt transparente, implicit, asociate cu copiii corespunzători din clasa JComponent din biblioteca Swing . În general, numai componentele complexe, cum ar fi tabelele și vizualizările colecției, pot necesita modificări ale șabloanelor lor implicite [1] .

Se leagă de AWT

Diagramă care ilustrează organizarea componentelor grafice AWT și a componentelor grafice Swing.

Biblioteca Swing este mai degrabă o extensie a AWT decât un înlocuitor pentru aceasta. De fapt, fiecare interfață grafică ușoară Swing se bazează pe o componentă AWT grea , deoarece toate componentele de nivel superior din Swing extind containerele de nivel superior AWT. Funcționalitatea de redare utilizată de Swing pentru proiectarea componentelor sale este asigurată de Java2D, o altă parte a AWT. Aranjarea componentelor este încredințată java.awt.LayoutManager . etc.

Diferențe cu AWT: mecanismul de funcționare

De la primele versiuni de Java, o parte din Abstract Window Toolkit (AWT) a furnizat API-uri independente de platformă pentru construirea de interfețe grafice. În AWT, aplicația utilizează de fapt obiecte Java pentru a controla componentele native specifice sistemului de operare utilizat și care alcătuiesc interfața grafică. Aceasta înseamnă că comportamentul componentelor (reacție la evenimente, redare etc.) este încredințat implementării lor dependente de sistem . Din acest motiv, componentele AWT sunt numite componente grele : ceea ce aplicația „vede” ca fiind crearea unei componente AWT, corespunde de fapt cu alocarea resurselor de către sistemul de operare. În schimb, componentele Swing sunt adesea descrise ca ușoare , deoarece nu trebuie să aloce resurse native în setul de instrumente GUI al sistemului de operare.

Elemente AWT utilizate în Swing

Managerii de aspect

În cele din urmă, în ceea ce privește compoziția vizuală și gestionarea, Swing are aspecte relative (care specifică poziția reciprocă între componente) care funcționează în mod opus comparativ cu aspectul absolut (în care este necesar să se specifice poziția exactă și dimensiunile a fiecărei componente). Această direcție către vizualizări „fluide” este o politică directă a dezvoltării Swing care reapare din cenușa cadrului AWT și presupunerea asociată a applet-urilor OE care au urmărit proiectarea și dezvoltarea setului de instrumente original GUI Java. Conceptual, această vizualizare de gestionare a aspectului este destul de similară cu cea care gestionează redarea conținutului HTML în browsere , abordând același set de concepte care i-au motivat creatorii.

Container de nivel superior

Deși este adevărat că componentele individuale sunt realizate în întregime în cod Java, containerele de nivel superior (dialoguri și applet-uri) sunt parțial implementate în cod nativ.

Avantajele față de AWT

Principalele avantaje ale Swing în comparație cu AWT sunt o consecință a faptului că componentele Swing sunt realizate în cod Java pur. De fapt, acest lucru înseamnă că componentele funcționează la fel pe toate platformele pentru care există o mașină virtuală. Bugurile detectate în timpul executării sistemului grafic (cel puțin pentru partea care privește interfața grafică) sunt aceleași pe toate platformele, ceea ce le permite să fie rezolvate printr-o simplă actualizare a bibliotecilor.

Privește și simte

Deoarece componentele sunt dezvoltate în Java, sistemul Swing are control asupra redării grafice a componentelor și acest lucru a permis dezvoltarea unui API prin care o aplicație poate personaliza aspectul interfeței sale grafice. Pe scurt, designul și stilul grafic al componentelor nu sunt solicitate de setul de instrumente grafice native al sistemului de operare, ci sunt reproduse prin emularea lor. Aceasta înseamnă că un nou L&F poate fi realizat pur și simplu prin implementarea claselor Java necesare (sau prin configurarea aspectului și simțului Synth, introdus de la J2SE 5.0).

Libertate în redare

Principalul avantaj al bibliotecii Swing este că permite programatorului să se abțină de la constrângerile impuse de arhitectura sistemului grafic adoptat de sistemul de operare utilizat. Sistemul grafic AWT suferă de aceste limitări, deoarece setul de componente și caracteristicile pe care le oferă aplicației sunt limitate la un standard comun, un set minim care poate fi suportat de toate sistemele de operare pe care trebuie să ruleze AWT.

Componentele Swing își gestionează propriile grafice și comportament în mod independent; este, de asemenea, adevărat că randarea finală trebuie încredințată sistemului de operare, deoarece acesta din urmă are în mână gestionarea dispozitivelor video și a dispozitivelor care semnalează intrarea utilizatorului (tastatură, mouse, roată mouse etc.), dar este, de asemenea, adevărat că Swing „își traduce” semantica în semantica de bază a componentelor sistemului de operare cu o legătură mult mai slabă decât arhitectura AWT în sine a permis să o obțină.
Astfel, de exemplu, fiecare componentă Swing este desenată pe dispozitivul grafic al sistemului de operare folosind un wrapper implementat în mod corespunzător în Java (creat printr-un obiect java.awt.Graphics ). Dar, spre deosebire de componentele AWT, care delegă designul widget-urilor native ale sistemului de operare, componentele Swing sunt responsabile pentru propria redare.

Dezavantaje comparativ cu AWT

Principalul dezavantaj în comparație cu AWT este că rulează mai lent.

Legături cu SWT

Standard Widget Toolkit (SWT) este un set de instrumente simultan dezvoltat inițial de IBM și acum întreținut de Eclipse Foundation . Implementările SWT sunt mai comune cu componentele AWT grele. Acest lucru conferă beneficii, cum ar fi o fidelitate mai precisă față de setul de instrumente de bază pentru fereastra nativă, cu prețul unei expuneri mai mari la o programare mai nativă în modelul de programare.

Apariția SWT a dat naștere unei mari diviziuni între dezvoltatorii desktop-ului Java, mulți fiind puternic în favoarea SWT și alții Swing. Dezvoltarea lui Sun în Swing continuă să se concentreze asupra fidelității aspectului și simțirii conectabile (PLAF) în fiecare fereastră a setului de instrumente. Între timp, nu există alte resurse de PLAF-uri fidele, dintre care multe se află pe site-ul javootoo. Arhivat 15 iulie 2005 în Arhiva Internet.

Au existat dezbateri semnificative despre performanța SWT față de cea a lui Swing; Dependența SWT de JNI o ​​face mai lentă atunci când componentele GUI și Java trebuie să facă schimb de date, dar mai rapid de trasat atunci când modelul de date a fost încărcat în GUI.

SWT servește foarte bine platforma Windows, dar unii consideră că este mai puțin eficientă ca o tehnologie de dezvoltare multiplataforma. Folosind funcționalitatea la nivel înalt a seturilor de instrumente pentru ferestre native, SWT readuce situația văzută în anii 1990 (cu seturi de instrumente precum zApp, Zinc, XVT și IBM / Smalltalk ), unde seturile de instrumente au încercat să mascheze diferențele în comportamentul și gestionarea focalizării. , gestionarea evenimentelor și a aspectelor grafice. Nerespectarea comportamentelor egale pe fiecare platformă poate provoca erori de programare subtile și dificil de remediat, cu efecte negative asupra interacțiunii utilizatorului și a aspectului grafic al interfeței grafice.

Exemplu

Următorul este un exemplu de program Hello World care folosește Swing.

 import javax.swing. * ;

clasa publică finală HelloWorld {

    public static void main ( String [] args ) {

        / * Acest lucru face ca tot codul care creează și afișează interfața grafică să ruleze pe fir
care gestionează coada de evenimente Swing (și AWT). * /
        SwingUtilities . invokeLater ( nou Runnable () {
            public void run () {
                mainOnEventDispatchThread ();
        } });
        
    }

    // Această metodă este întotdeauna invocată pe firul care gestionează coada de evenimente ↓

    private static void mainOnEventDispatchThread () {
            // Creați cadru cu titlul „Bună ziua, lume!”
            JFrame f = JFrame nou ( „Bună ziua, lume!” );
            // Dimensiunea ferestrei
            f . setSize ( 200 , 100 );

            // Face ca cadrul să solicite JVM să termine programul
            // când fereastra este închisă.
            f . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE );

            f . add ( nou JLabel ( "Hello, World!" ));

            f . setVisible ( adevărat );
    }
}

Notă

  1. ^ Cu toate acestea, pentru a înțelege pe deplin potențialul pe care îl face posibilă arhitectura Swing, luați în considerare situația ipotetică în care sunt create modele modificate de tabele și liste deasupra serviciilor DAO și / sau EJB

Bibliografie

Elemente conexe

Alte proiecte

linkuri externe

Link-uri de pe site-uri oficiale:

Alte legături: