Documente Academic
Documente Profesional
Documente Cultură
Clasele JFrame
Nu spune niciodat nu se poate, ci incepe cu s vedem.
Nicolae Iorga
Obiective:
Cuprins:
I. Clasele JFrame
Containerul de baz n care este afiat o aplicaie este clasa Frame, respectiv, n
interpretarea Swing, acea clas este JFrame motenitor al clasei java.awt.Frame.
JFrame este punctul de nceput al prii grafice din aplicaie.
Urmtorul exemplu creaz o fereastr cu dimensiunile 300 x 300 pixeli:
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
JFrame myFrame = new JFrame();
myFrame.setSize(300, 300);
myFrame.setVisible(true);
}
}
1.1. Proprietile i metodele clasei JFrame
Clasa JFrame motenete o mulime de proprieti de la strmoii si, clasele Frame,
Window, Container i Component.
Constructorul clasei JFrame
JFrame mai are nc trei constructori pe lng cel default. Primul implic un parametru
de tip String. Acest parametru va reprezenta titlul din antetul ferestrei:
JFrame myFrame = new JFrame("Hello Window");
Al doilea constructor accept un parametru de tip GraphicsConfiguration i permite
emiterea ferestrei ntr-un context grafic specific (alt monitor i altele de genul acesta):
JFrame myFrame = new
JFrame(GraphicsEnvironment.getLocalGraphicsEnvironment().getSc
reenDevices()[0].getDefaultConfiguration());
Al treilea constructor accept ambii parametri menionai mai sus:
Pentru a elimina butonul adugat din fereastr, putem utiliza metoda remove. Dac
definim o component i o plasm ntr-o variabil, atunci numele variabilei poate pur i
simplu s fie expediat metodei remove:
...
JButton btn = new JButton("Hello!");
myFrame.add(btn);
...
myFrame.remove(btn);
...
n cazul n care controlul (componenta) a fost adugat anonim:
myFrame.add(new JButton("Hello!"));
trebuie s fie gsit manual i eliminat din container. De exemplu:
myFrame.remove(myFrame.getContentPane().getComponent(0));
S explicm linia precedent. Metoda myFrame.remove este clar, dar nu am
explicat getContentPane i getComponent.
i anume, n exemplul precedent este evident faptul c respectivul control este extras
din container prin indexul su din colecia de controale. ns, problema este urmtoarea: cum
s ajungem la aceea colecie?
JFrame este o fereastr care conine numai un control, containerul content pane (de
fapt, unul care este important pentru noi n acest moment). Containerele top level, precum
JFrame, conin cteva obiecte care reprezint diferite nivele, dar vom vorbi despre aceasta mai
trziu. Toate celelalte controale din fereastr sunt situate n acest container. Aceasta nseamn
c trebuie s extragem containerul mai nti, iar apoi s cutm controalele din el:
...
myFrame.getContentPane().getComponents()
for(int i=0;i<
myFrame.getContentPane().getComponentCount();i++)
myFrame.getContentPane().getComponent(i)
...
JFrame va fi rar utilizat n forma afiat, ci mult mai mult ca un ablon pentru propria
clas. Aadar, vom plasa majoritatea proprietilor acestui obiect n constructorul clasei sale.
De obicei, metoda separat (initComponents sau numai init) care efectueaz setrile
obiectului actual este apelat n interiorul constructorului. n aceast clas, vom adresa toate
setrile (metodele i proprietile) prin cuvntul cheie this:
MyFrame.java
import javax.swing.JFrame;
public class MyFrame extends JFrame {
public MyFrame()
{
initComponents();
}
void initComponents()
{
this.setSize(300, 300);
this.setVisible(true);
}
}
Program
public class Main {
public static void main(String[] args) {
MyFrame mFrame = new MyFrame();
}
}
n clasa JFrame, cu fiecare redesenare a ferestrei (dac un control trece peste aceasta
sau dac o mutm), apare activarea metodei paint, aceasta fiind, aadar, metoda n cadrul
creia putem manipula coninutul grafic al clasei:
@Override
public void paint(Graphics g) {
g.drawString("Hello", 200, 200);
}
Pentru a poziiona un anumit control ntr-o anumit parte din Layout, trebuie s-l
accentum n timpul utilizrii metodei add a containerului nsui, atunci cnd vom introduce
numele prii containerului ca al doilea parametru.
Pentru a umple toate prile containerului din imagine, putem utiliza codul urmtor:
import java.awt.*;
public class Main {
public static void main(String[] args) {
Frame f = new Frame();
Label l = new Label("Helo from top of the page");
Label l1 = new Label("Helo from center of the page");
Label l2 = new Label("Helo from bottom of the page");
Label l3 = new Label("left");
Label l4 = new Label("right");
f.add(l,BorderLayout.PAGE_START);
f.add(l1,BorderLayout.CENTER);
f.add(l2,BorderLayout.PAGE_END);
f.add(l3,BorderLayout.LINE_START);
f.add(l4,BorderLayout.LINE_END);
f.setSize(300, 300);
f.setVisible(true);
}
}
a) Border Layout este mai dificil, deoarece
controalele din fiecare parte sunt plasate unul
peste altul, ceea ce nseamn c putem avea
numai un control (sau container) vizibil ntro parte a Layout-ului.
for(int i=0;i<10;i++)
f.add(new Button("Button "+ i));
f.setSize(300, 300);
f.setVisible(true);
}
}
Exemplul d urmtoarea ieire:
Putem
controla
respingerea
controalelor de marginile celulei. n acest caz,
vom introduce nc doi parametri n
constructor, respingerea orizontal i
vertical.
De exemplu:
LayoutManager layOut = new GridLayout(3, 3, 10,10);
d) CardLayout este un Layout oarecum mai exotic fa de precedentele. Poate s conin mai
multe containere, n timp ce numai unul va fi afiat la un moment dat. n acest mod, se obine
posibilitatea de a crea panouri.
Setarea CardLayout-ului i utilizarea sa sunt puin mai complicate fa de utilizarea
celorlalte Layout-uri.
Mai nti trebuie s crem un panou care le va conine pe celelalte panouri. Acest
panou va fi ntodeauna vizibil, iar Layout-ul su va fi CardLayout:
...
Panel mainPanel = new Panel();
CardLayout layOut = new CardLayout();
mainPanel.setLayout(layOut);
...
Dup crearea panoului principal, vom crea subpanourile sale. De exemplu, vom face
dou subpanouri care vor conine dou butoane:
...
Panel firstP = new Panel();
firstP.add(new Button("first panel button"));
Panel secondP = new Panel();
secondP.add(new Button("second panel button"));
...
Dup crearea subpanourilor, le vom aduga n panoul principal, moment n care le
vom atribui un nume logic, respectiv constraint, prin care vor fi identificate n lista panoului:
...
mainPanel.add(firstP,"First");
mainPanel.add(secondP,"Second");
...
n cele din urm, vom activa panoul dorit, prin metoda show a clasei CardLayout, i
vom aduga panoul principal n aplicaia principal:
...
layOut.show(mainPanel, "Second");
f.add(mainPanel);
...
Metoda show a clasei CardLayout accept doi parametri: numele panoului printe
(n cazul nostru, acesta este mainPanel) i numele panoului pe care dorim s-l afim. Pentru
numele panoului pe care dorim s-l afim, vom introduce numele su logic, adic constraint.
Pentru a schimba panoul existent, vom utiliza de asemenea metoda show.
Urmtorul exemplu ilustreaz schimbarea panoului curent prin activarea butonului:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
static CardLayout layOut;
static Panel mainPanel;
static Frame f;
public
static
void
main(String[]
args)
throws
InterruptedException {
f = new Frame();
mainPanel = new Panel();
layOut = new CardLayout();
mainPanel.setLayout(layOut);
Panel firstP = new Panel();
Panel secondP = new Panel();
Button b = new Button("first panel button");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
layOut.show(mainPanel, "Second");
}
});
Button b1 = new Button("second panel button");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
layOut.show(mainPanel, "First");
}
});
firstP.add(b);
secondP.add(b1);
mainPanel.add(firstP,"First");
mainPanel.add(secondP,"Second");
f.add(mainPanel);
f.setSize(300, 300);
f.setVisible(true);
}
}
Ieirea acestui exemplu este urmtoarea:
GroupLayout implic dou direcii (orizontal i vertical) i dou tipuri de setri ale
controalelor (secvenial i paralel).
Pentru a seta un anumit control, trebuie s crem un grup de un anumit tip. Dac ne
uitm la imagine ca la un grup orizontal, putem spune c grupul este alctuit din dou
butoane. 1: Hello a i 2: Hello b. Acest grup se mut secvenial, de la stnga la dreapta.
Dac ne utitm la imagine vertical, de sus n jos, butoanele nu vor fi aranjate secvenial, ci
paralel, deoarece sunt plasate unul lng altul pe acelai plan. Acum grupul este: 1: Hello a i
1: Hello b.
Atunci cnd combinm aceste dou zone, rezultatul este c fereastra conine un grup
orizontal, secvenial, de dou butoane i un grup vertical, paralel, de dou butoane. Cnd acest
lucru este tradus n Java, rezultatul este codul urmtor:
GroupLayout layout = new GroupLayout(this.getContentPane());
this.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
JButton a = new JButton("Hello a");
JButton b = new JButton("Hello b");
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addComponent(a).addComponent(b)
);
layout.setVerticalGroup(
layout.createParallelGroup()
.addComponent(a).addComponent(b)
);
Observm c aceleai controale apar att n grupul orizontal, ct i n cel vertical.
Aceste controale trebuie s se suprapun pe poziiile or orizontale i verticale, pentru ca
Layout-ul c fie creat n mod corespunztor. Aceasta nseamn c controalele nu pot fi create
dinamic, motiv pentru care acest Layout nu este convenabil pentru utilizare n afara
platformei.
Metodele setAutoCreateGaps i setAutoCreateContainerGaps definesc n mod
automat spaiul dintre controalele din cadrul grupului.
C) BoxLayout red controalele unul dup altul, pe o anumit ax:
...
this.setLayout(new BoxLayout(this.getContentPane(),
BoxLayout.Y_AXIS));
for(int i=0;i<10;i++)
this.getContentPane().add(new JButton("Hello "+i));
...
C) SpringLayout ofer setarea constrngerilor (metoda
putConstraint), astfel nct fiecare control s fie plasat
ntr-o anumit locaie, respectnd regulile unei anumite
constrngeri. n imaginea viitoare, butonul este
restricionat la 100 de pixeli spre vest i 150 de pixeli
spre nord:
10
btn.setBorder(BorderFactory.createMatteBorder(15, 5, 15, 5,
Color.yellow));
btn.setBorder(BorderFactory.createTitledBorder("My
title"));
border
Proprietatea border poate fi setat i prin GUI Builder. Trebuie s selectm tipul dorit
al cadrului i s-l tragem n control (sau, pur i simplu, s dm un clic cu tasta stng a
mouse-ului pe cadru i nc o dat pe controlul int):
Pentru a modifica setrile cadrului, n proprietile controlului (Properties), vom
selecta opiunea Border:
III. Exerciiu/Tem
Problem:
Trebuie s facem o aplicaie Java puzzle. Aplicaia va
fi alctuit din 12 butoane distribuite pe controlul
JFrame, utiliznd GridLayout. Unul dintre butoane va fi
ntodeauna invizibil i fiecare buton care va fi apsat va
fi mutat n locul celui invizibil, n timp ce butonul
invizibil i va lua locul. Dac butonul activat nu este
plasat lng butonul invizibil, nlocuirea butonului ar
trebui s fie dezactivat.
Soluie:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JButton;
public class Main {
static JButton invisible;
static void switchButtons(JButton clickedButton)
{
if(
invisible.getLocation().x < (clickedButton.getLocation().x clickedButton.getSize().width) ||
invisible.getLocation().x > (clickedButton.getLocation().x +
clickedButton.getSize().width) ||
invisible.getLocation().y < (clickedButton.getLocation().y clickedButton.getSize().height) ||
11
III. Bibliografie
http://docs.oracle.com/cd/E24382_01/user.1112/e17455/java_swing.htm
http://docs.oracle.com/middleware/1212/jdev/OJDUG/java_swing.htm
12
1. Cum se numete proprietatea prin care este reprezentat cadrul din control?
border
edge
stroke
outline
2. Care swing layout poziioneaz controalele unul dup cellalt, de-a lungul unei anumite
axe?
FlowLayout
BoxLayout
SpringLayout
GroupLayout
3. Dac utilizm limitatori pentru a poziiona un control pe layout, despre ce tip de swing
layout este vorba?
BoxLayout
GroupLayout
SpringLayout
FlowLayout
4. Cum se numete instrumentul care ofer manipularea grafic a cadrelor?
Border wizard
Border customizer
Border modifier
Border creator
5. Care este numele clasei care conine metodele pentru crearea diferitelor obiecte Border?
BorderCreator
Borders
BorderFactory
Border
6. Care metod seteaz proprietatea border a controlului?
putBorder
setBorder
addBorder
border
7. Cnd vorbim despre Group Layout-ul vertical, avem urmtoarele dou tipuri de poziionare
a controalelor:
secvenial i paralel
orizontal i vertical
nord i sud
est i vest
13