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

Similar Posts