Poo Laboratoare1 [628178]
Poo Laboratoare1
Contents
Laborator8 2
1 Introducere ˆ ın Swing 2
1.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Pachetul javax.swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Componente ¸ si containere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3.1 Containerele de nivel ˆ ınalt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.2 Containerele intermediare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.3 Componente pentru editare de text . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.4 Componente atomice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.5 Componente complexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Concluzie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Probleme de laborator 5
2.1 Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Problema 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.5 Problema 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.6 Problema 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.7 Problema 7 (bonus) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1http://www.google.ro/
1
Laborator8
Programare Orientat˘ a pe Obiecte: Laborator 8
1 Introducere ˆ ın Swing
1.1 Overview
De la aparit ¸ia limbajului Java, bibliotecile de clase care ofer˘ a servicii grafice au suferit probabil cele mai
mari schimb˘ ari ˆ ın trecerea de la o versiune la alta. Acest lucru se datoreaz˘ a, pe de o parte dificult˘ at ¸ii
legate de implementarea not ¸iunii de portabilitate, pe de alt˘ a parte nevoii de a integra mecanismele GUI
cu tehnologii ap˘ arute ¸ si dezvoltate ulterior, cum ar fi Java Beans .
In momentul actual, exist˘ a dou˘ a modalit˘ at ¸i de a crea o aplicat ¸ie cu interfat ¸˘ a grafic˘ a ¸ si anume:
•AWT (Abstract Windowing Toolkit) – este API-ul init ¸ial pus la dispozit ¸ie ˆ ıncepˆ and cu primele
versiuni de Java
•Swing – este parte dintr-un proiect mai amplu numit JFC (Java Foundation Classes) creat
ˆ ın urma colabor˘ arii dintre Sun,Netscape ¸ siIBM , care se bazeaz˘ a pe modelul AWT , ex-
tinzˆ and funct ¸ionalitatea acestuia ¸ si ad˘ augˆ and sau ˆ ınlocuind unele componente pentru dezvoltarea
aplicat ¸iilor GUI.
Este preferabil ca aplicat ¸iile Java s˘ a fie create folosind tehnologia Swing, deoarece aceasta pune la
dispozit ¸ie o palet˘ a mult mai larg˘ a de facilit˘ at ¸i, ˆ ıns˘ a nu se va renunt ¸a complet la AWT deoarece aici
exist˘ a clase esent ¸iale, reutilizate ˆ ın Swing. Dezavantajul AWT-ului este c˘ a arhitect ¸ii lui au fost nevoit ¸i
s˘ a ia ˆ ın considerare numai acele clase de obiecte grafice, care exist˘ a ˆ ıntr-o form˘ a sau alta pe toate
platformele. Aceasta a f˘ acut ca num˘ arul de clase de obiecte grafice din pachetul java.awt s˘ a fie destul
de restrˆ ans, renunt ¸ˆ andu-se la funct ¸ionalit˘ at ¸ile specifice numai anumitor platforme.
1.2 Pachetul javax.swing
Componentele Swing, spre deosebire de predecesoarele din versiunile Java anterioare, sunt implementate
ˆ ın ˆ ıntregime ˆ ın Java. Aceasta are ca rezultat o mai bun˘ a compatibilitate cu platforme diferite decˆ at
ˆ ın cazul folosirii componentelor AWT. Unul din principalele deziderate ale tehnologiei Swing a fost s˘ a
pun˘ a la dispozit ¸ie un set de componente GUI extensibile care s˘ a permit˘ a dezvoltarea rapid˘ a de aplicat ¸ii
Java cu interfat ¸˘ a grafic˘ a competitiv˘ a din punct de vedere comercial. Cel mai important pachet, care
cont ¸ine componentele de baz˘ a este javax.swing .
Orice interfat ¸˘ a utilizator Java este compus˘ a din urm˘ atoarele elemente:
•Componente – orice poate fi plasat pe o interfat ¸˘ a utilizator, cum ar fi butoane, liste de derulare,
meniuri pop-up, casete de validare sau cˆ ampuri de text.
•Containere – acestea reprezint˘ a componente care pot cont ¸ine alte componente (de exemplu
panouri, casete de dialog sau ferestre independente)
•Administratori de dispunere – reprezint˘ a obiecte care definesc modul ˆ ın care sunt aranjate
(dispuse) componentele ˆ ıntr-un container. Administratorul de dispunere nu este vizibil ˆ ıntr-o
interfat ¸˘ a, ˆ ıns˘ a sunt vizibile rezultatele ”muncii” sale. Dispunerea componentelor interfet ¸ei este
de mai multe feluri: dispunere secvent ¸ial˘ a, dispunere tabelar˘ a, dispunere marginal˘ a sau dispunere
tabelar˘ a neproport ¸ional˘ a.
1.3 Componente ¸ si containere
Componentele Swing sunt derivate dintr-o singur˘ a clas˘ a de baz˘ a, numit˘ a JComponent , care mo¸ stene¸ ste
la rˆ andul ei clasa Container dinAWT . Componentele folosite pentru crearea interfet ¸elor grafice Swing
pot fi grupate astfel:
2
•Componente atomice: JLabel ,JButton ,JCheckBox ,JRadioButton ,JToggleButton ,
JScrollBar ,JSlider ,JProgressBar ,JSeparator
•Componente complexe: JTable ,JTree ,JComboBox ,JSpinner ,JList ,JFileChooser ,JColor-
Chooser ,JOptionPane
•Componente pentru editare de text: JTextField ,JFormattedTextField ,JPasswordField ,
JTextArea ,JEditorPane ,JTextPane
•Meniuri: JMenuBar ,JMenu ,JPopupMenu ,JMenuItem ,JCheckboxMenuItem ,JRa-
dioButtonMenuItem
•Containere intermediare: JPanel ,JScrollPane ,JSplitPane ,JTabbedPane ,JDesktopPane ,
JToolBar ,JLayeredPane ,JRootPane
•Containere de nivel ˆ ınalt: JFrame ,JDialog ,JWindow ,JInternalFrame ,JApplet
Containerele reprezint˘ a suprafet ¸e de afi¸ sare pe care pot fi plasate alte componente, eventual chiar alte
containere. Superclasa componentelor de acest tip este Container , din modelul AWT .
1.3.1 Containerele de nivel ˆ ınalt
Pentru a fi afi¸ sate pe ecran componentele grafice ale unei aplicat ¸ii trebuie plasate pe o suprafat ¸˘ a de
afi¸ sare (container ). Fiecare component˘ a poate fi cont ¸inut˘ a doar ˆ ıntr-un singur container, ad˘ augarea ei
pe o suprafat ¸˘ a nou˘ a de afi¸ sare determinˆ and eliminarea ei de pe vechiul container pe care fusese plasat˘ a.
Deoarece containerele pot fi ˆ ıncapsulate ˆ ın alte containere, o component˘ a va face parte la un moment
dat dintr-o ierarhie. R˘ ad˘ acina acestei ierarhii trebuie s˘ a fie un a¸ sa numit container de nivel ˆ ınalt, care
este reprezentat de una din clasele JFrame ,JDialog sauJApplet .
ˆIn general orice aplicat ¸ie Java independent˘ a bazat˘ a pe Swing cont ¸ine cel put ¸in un container de nivel
ˆ ınalt reprezentat de fereastra principal˘ a a programului, instant ¸˘ a a clasei JFrame.
1.3.2 Containerele intermediare
Acestea reprezint˘ a suprafet ¸e de afi¸ sare cu ajutorul c˘ arora pot fi organizate mai eficient componentele
aplicat ¸iei, putˆ and fi imbricate.
JPanel are aceea¸ si funct ¸ionalitate ca ¸ si clasa Panel dinAWT , fiind folosit pentru gruparea mai multor
componente Swing ¸ si plasarea lor ˆ ımpreun˘ a pe o alt˘ a suprafat ¸˘ a de afi¸ sare. Gestionarul de pozit ¸ionare
implicit este FlowLayout , acesta putˆ and fi schimbat ˆ ıns˘ a, chiar ˆ ın momentul construirii obiectului
JPanel, sau ulterior cu metoda setLayout() . Ad˘ augarea de componente se realizeaz˘ a ca pentru orice
container, folosind metoda add() .
JScrollPane este o clas˘ a foarte important˘ a ˆ ın arhitectura modelului Swing, deoarece ofer˘ a suport
pentru derularea pe orizontal˘ a ¸ si vertical˘ a a componentelor a c˘ aror reprezentare complet˘ a nu ˆ ıncape ˆ ın
suprafat ¸a asociat˘ a, nici o component˘ a Swing neoferind suport intrinsec pentru aceast˘ a operat ¸ie.
Clasa JComponent este superclasa tuturor componentelor Swing, mai put ¸in a celor care descriu
containere de nivel ˆ ınalt JFrame, JDialog, JApplet. Deoarece JComponent extinde clasa Container,
deci ¸ si Component, ea mo¸ stene¸ ste funct ¸ionalitatea general˘ a a containerelor ¸ si componentelor AWT,
furnizˆ and bine ˆ ınt ¸eles ¸ si o serie ˆ ıntreag˘ a de noi facilit˘ at ¸i.
1.3.3 Componente pentru editare de text
Componentele Swing pentru afi¸ sarea ¸ si editarea textelor sunt grupate ˆ ıntr-o ierarhie ce are ca r˘ ad˘ acin˘ a
clasa JTextComponent din pachetul javax.swing.text . Clasele pot ˆ ımp˘ art ¸ite ˆ ın trei categorii, core-
spunz˘ atoare tipului textului editat:
•Text simplu pe o singur˘ a linie
–JTextField – permite editarea unui text simplu, pe o singur˘ a linie
3
–JPasswordField – permite editarea de parole. Textul acestora va fi ascuns, ˆ ın locul carac-
terelor introduse fiind afi¸ sat un caracter simbolic, cum ar fi ’*’.
•Text simplu pe mai multe linii
–JTextArea – permite editarea unui text simplu, pe mai multe linii. Orice atribut legat de
stil, cum ar fi culoarea sau fontul, se aplic˘ a ˆ ıntregului text ¸ si nu poate fi specificat doar
unei anumite port ¸iuni. Uzual, o component˘ a de acest tip va fi inclus˘ a ˆ ıntr-un container
JScrollPane , pentru a permite navigarea pe vertical˘ a ¸ si orizontal˘ a dac˘ a textul introdus nu
ˆ ıncape ˆ ın suprafat ¸a alocat˘ a obiectului. Acest lucru este valabil pentru toate componentele
Swing pentru care are sens not ¸iunea de navigare pe orizontal˘ a sau vertical˘ a, nici una neoferind
suport intrinsec pentru aceast˘ a operat ¸iune.
•Text cu stil ˆ ımbog˘ at ¸it pe mai multe linii
–JEditorPane – permite afi¸ sarea ¸ si editarea de texte scrise cu stiluri multiple ¸ si care pot
include imagini sau chiar diverse alte componente
–JTextPane – aceast˘ a clas˘ a extinde JEditorPane , oferind facilit˘ at ¸i suplimentare pentru
lucrul cu stiluri ¸ si paragrafe
1.3.4 Componente atomice
ˆIn categoria componentelor atomice sunt incluse componentele Swing cu funct ¸ionalitate simpl˘ a, a c˘ aror
utilizare este facil˘ a ¸ si ˆ ın general asem˘ an˘ atoare cu a echivalentelor din AWT:
•Etichete: JLabel
•Butoane simple sau cu dou˘ a st˘ ari: JButton ,JCheckBox ,JRadioButton . Mai multe butoane
radio pot fi grupate folosind clasa ButtonGroup , pentru a permite selectarea doar a unuia dintre
ele.
•Componente pentru progres ¸ si derulare: JSlider ,JProgressBar ,JScrollBar
•Separatori: JSeparator
1.3.5 Componente complexe
Clasa JList descrie o list˘ a de elemente dispuse pe una sau mai multe coloane, din care utilizatorul poate
selecta unul sau mai multe. Uzual un obiect de acest tip va fi inclus ˆ ıntr-un container de tip JScroll-
Pane . Clasa ofer˘ a metode pentru selectarea unor elemente din cadrul programului setSelectedIndex() ,
setSelectedIndices() , etc. ¸ si pentru obt ¸inerea celor selectate la un moment dat getSelectedIndex() ,
getSelectedIndices() , etc..
Clasa JComboBox este similar˘ a cu JList, cu deosebirea c˘ a permite doar selectarea unui singur articol,
acesta fiind ¸ si singurul permanent vizibil. Lista celorlalte elemente este afi¸ sat˘ a doar la ap˘ asarea unui
buton marcat cu o s˘ ageat˘ a, ce face parte integrant˘ a din component˘ a. JComboBox funct ¸ioneaz˘ a dup˘ a
acelea¸ si principii ca ¸ si clasa JList.
Clasa JTable permite crearea de componente care s˘ a afi¸ seze o serie de elemente ˆ ıntr-un format tabelar,
articolele fiind dispuse pe linii ¸ si coloane. Un tabel poate fi folosit doar pentru afi¸ sarea formatat˘ a a
unor date, dar este posibil˘ a ¸ si editarea informat ¸iei din celulele sale. De asemenea, liniile tabelului pot fi
marcate ca selectate, tipul select ¸iei fiind simplu sau compus, tabelele extinzˆ and astfel funct ¸ionalitatea
listelor. O serie de clase ¸ si interfet ¸e necesare lucrului cu tabele se g˘ asesc ˆ ın pachetul javax.swing.table ,
acesta fiind a¸ sadar cel ce trebuie importat.
1.4 Concluzie
Pˆ an˘ a acum s-aˆ ıncercat crearea unei imagini de ansamblu asupra facilit˘ at ¸ilor oferite de Swing. Descrierea
API-ului pe care ˆ ıl pune la dispozit ¸ie fiecare clasa prezentat˘ a mai sus presupune abuzarea spat ¸iului de
afi¸ sare ¸ si nu constituie subiectul acetui laborator. Pentru viziualizarea ˆ ın am˘ anunt a metodelor ¸ si
4
membrilor de clas˘ a, consultat ¸i documentat ¸ia oficial˘ a Sun . De asemenea, pentru mici exemple de
utilizare consulat ¸i materialul de curs .
2 Probleme de laborator
Observat ¸ie! Se vor utiliza clasele Swing corespunz˘ atoare celor AWT: JFrame pentru Frame,
JButton pentru Button, JTextField pentru TextField etc.
2.1 Problema 1
(1 punct) Program pentru afi¸ sarea unei ferestre cu titlu folosind clasa JFrame. Funct ¸ia main() creeaz˘ a
un obiect JFrame, stabile¸ ste dimensiunile ¸ si cere afi¸ sarea acestuia. Vet ¸i folosi metodele setSize() ,
respectiv setVisible() . S˘ a se observe efectul unui clic pe butonul de ˆ ınchidere (X). Pentru terminarea
aplicat ¸iei tastat ¸i CTRL-C. Ad˘ augat ¸i apoi urm˘ atoarea instruct ¸iune, unde jfeste obiectul JFrame tocmai
creat:
jf.setDefaultCloseOperation( JFrame.EXIT ONCLOSE );
2.2 Problema 2
(1 punct) Pentru afi¸ sarea unei ferestre centrate pe mijlocul ecranului, se va folosi funct ¸ia urm˘ atoare
(ca metod˘ a static˘ a, separat˘ a de clasa JFrame):
public static void center (Window w) {
Dimension ws = w.getSize();
Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();
int newX = ( ss.width – ws.width ) / 2;
int newY = ( ss.height- ws.height ) / 2;
w.setLocation( newX, newY );
}
S˘ a se adauge metoda de mai sus ca metod˘ a a clasei anterioare.
2.3 Problema 3
(2 puncte) Program pentru afi¸ sarea unei etichete JLabel urmat˘ a de un cˆ amp text JTextField nemodi-
ficabil (se va folosi metoda setEditable() cu parametrul false ), pentru afi¸ sarea numelui ¸ si valorii unei
propriet˘ at ¸i (de exemplu numele Color ˆ ın etichet˘ a ¸ si valoarea White ˆ ın campul text). Se va folosi a¸ sezarea
FlowLayout. Se vor ad˘ auga apoi:
•bordur˘ a la cˆ ampul text (se va folosi setBorder( new EtchedBorder() ) )
•culoarea alb˘ a la cˆ ampul text (se va folosi setBackground( Color.white ) )
•dimensiunea dorit˘ a la cˆ ampul text (de exemplu setPreferredSize( new Dimension(180, 20) ) )
2.4 Problema 4
(2 puncte) Program care adaug˘ a unei ferestre JFrame (avˆ and dimensinile 240, respectiv 200) cinci
butoane cu numele extrase din vectorul urm˘ ator:
String pos[]= {‘‘East’’, ‘‘West’’, ‘‘North’’, ‘‘South’’, ‘‘Center’’ };
•se va extrage din fereastr˘ a container-ul acesteia folosind apelul:
5
Container cp = frame.getContentPane();
•se va ad˘ auga la acest panou ( ˆ ıntr-un ciclu) fiecare buton folosind metoda add() cu doi parametri:
–numele variabilei buton JButton
–un ¸ sir care arat˘ a pozit ¸ia butonului ˆ ın panou (acela¸ si cu inscript ¸ia butonului din vectorul pos)
Observat ¸ie! Modul de a¸ sezare implicit este BorderLayout.
•se va elimina al doilea argument al metodei add() ¸ si se va observa efectul
•se va modifica modul de a¸ sezare ˆ ın fereastra principala la FlowLayout
frame.setLayout ( new FlowLayout() );
•se va modifica modul de a¸ sezareˆ ın fereastra principal˘ a la GridLayout, folosind succesiv constructor
f˘ ar˘ a argumente sau cu dou˘ a argumente ˆ ıntregi:
–primul argument 0
–al doilea argument num˘ arul de coloane prin care se dispun componentele ˆ ın panou: 0, 1, 2
2.5 Problema 5
(2 puncte) Program care folose¸ ste un vector de opt butoane JButton ¸ si un vector de panouri JPanel.
Se va ad˘ auga fiecare buton unui panou separat ¸ si apoi se va adauga fiecare panou ferestrei principale.
Dispunerea ˆ ın container-ul principal este GridLayout pe dou˘ a coloane. Se va compara ad˘ augarea di-
rect˘ a a butoanelor la fereastr˘ a cu ad˘ augarea prin panouri separate. Fereastra principal˘ a poate avea
dimensiunile (200, 200). Pentru crearea de intervale ˆ ıntre panouri se poate folosi metoda setBorder() :
pp[i].setBorder( new EmptyBorder( 1, 1, 1, 1 ) );
sau
pp[i].setBorder( BorderFactory.createEmptyBorder( 1, 1, 1, 1 ) );
2.6 Problema 6
(2 puncte) Program care adaug˘ a ferestrei principale dou˘ a panouri, unul sub altul:
•un panou cu un cˆ amp text JTextField ¸ si o eticheta JLabel ce cont ¸ine ¸ sirul Open . Eticheta poate
fi ˆ ın stˆ anga sau deasupra cˆ ampului text. Cˆ ampul text are lungime de 30 de caractere (se va folosi
new JTextField( “ ”, 30 ) )
•un panou cu trei butoane ˆ ın linie, notate OK,Cancel ¸ siBrowse .
Fereastra principal˘ a are dimensiunile (400, 160). Facet ¸i modific˘ arile necesare pentru ca fereastra afi¸ sat˘ a
s˘ a semene cˆ at mai bine cu fereastra produs˘ a de comanda Run din Windows (cu titlul Run). Modificat ¸i
ˆ ın programul anterior stilul de desenare (Look and Fell) pentru sistemul gazd˘ a folosind metoda set-
LookAndFeel() astfel:
try {
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
}catch( Exception e ) {}
6
2.7 Problema 7 (bonus)
(2 puncte) Program pentru afi¸ sarea unui buton cu inscript ¸ia Colors ¸ si modificarea culorii acestuia ca
urmare a unui clic pe buton. Metoda setForeground() cu parametru de tip Color are efectul de
modificare a culorii textului, iar metoda setBackground() modific˘ a culoarea butonului. La fiecare clic
se va itera pe un vector de culori initializat cu constante (Color.RED, Color.BLUE, etc.). Se va folosi o
fereastr˘ a JFrame cu dimensiuni mici (100, 100) ¸ si organizarea FlowLayout. S˘ a se prevad˘ a ¸ si posibilitatea
de act ¸ionare a butonului prin tasta ALT-C:
buton.setMnemonic( KeyEvent.VK C );
7
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Poo Laboratoare1 [628178] (ID: 628178)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
