|
|
|
| void paint(Graphics g) | Deseneaza o componenta. Este o metoda supradefinita de fiecare componenta în parte pentru a furniza reprezentarea sa grafica specifica. Metoda este apelata de fiecare data când continutul componentei trebuie desenat (redesenat) - la afisarea pentru prima data a componentei, la operatii de redimensionare, etc. Nu se apeleaza explicit. |
| void update(Graphics g) | Actualizeaza starea grafica a unei componente. Actiunea acestei metode se realizeaza în
trei pasi:
|
| void repaint() | Executa explicit un apel al metodei update pentru a actualiza reprezentarea grafica a unei componente. |
In exemplul de mai jos, redefinim metoda paint pentru un obiect de tip Frame, pentru a crea o clasa ce instantiaza ferestre pentru o aplicatie demonstrativa (în coltul stânga sus este afisat textul "Aplicatie DEMO").
import java.awt.*;
class Fereastra extends Frame {
public Fereastra(String titlu) {
super(titlu);
setSize(200, 100);
}
public void paint(Graphics g) {
super.paint(g);//apelez metoda paint a clasei Frame
g.setFont(new Font("Arial", Font.BOLD, 11));
g.setColor(Color.red);
g.drawString("Aplicatie DEMO", 5, 35);
}
}
public class TestPaint {
public static void main(String args[]) {
Fereastra f = new Fereastra("Test Paint");
f.show();
}
}
Observati ca la orice redimensionare a ferestrei textul "Aplicatie DEMO" va fi redesenat.
Daca desenarea acestui text ar fi fost facuta oriunde în alta parte decât în metoda paint,
la prima redimensionare a ferestrei acesta s-ar pierde.
Asadar, desenarea în Java trebuie sa se faca doar în cadrul metodelor paint ale
componentelor grafice.
Suprafete de desenare - clasa Canvas
In afara posibilitatii de a utiliza componente grafice standard, Java ofera si posibilitatea
controlului la nivel de punct (pixel) pe dispozitivul grafic, respectiv desenarea a diferite
forme grafice direct pe suprafata unei componente. Desi este posibil, în general nu se
deseneaza la nivel de pixel direct pe suprafata ferestrelor sau a altor suprafete de afisare.
In Java a fost definit un tip special de componenta numita Canvas (pânza de pictor),
a carui scop este de a fi extinsa pentru a implementa obiecte grafice cu o anumita înfatisare.
Asadar clasa Canvas este o clasa generica din care se deriveaza subclase pentru
crearea suprafetelor de desenare (planse).
Plansele nu pot contine alte componente grafice, ele fiind utilizate doar ca suprafete de
desenat sau ca fundal pentru animatie. Desenarea pe o plansa se face prin supradefinirea
metodei paint.
Concret, o plansa este suprafata dreptunghiulara de culoare alba pe care se poate
desena. Implicit dimensiunile plansei sunt 0 si, din acest motiv, gestionarii de pozitionare
nu vor avea la dispozitie dimensiuni implcite pentru afisarea unui obiect de tip Canvas.
Pentru a evita acest neajuns este recomandat ca o plansa sa redefineasca si metodele
getMinimumSize, getMaximumSize, getPreferredSize pentru a-si specifica dimensiunile
implicite.
Etapele care trebuie parcurse pentru crearea unui desen, sau mai bine zis, a unui obiect grafic cu o anumita înfatisare sunt:
class Plansa extends Canvas {
public void paint(Graphics g) {
. . .
//desenarea
}
public Dimension getMinimumSize() {
return . . .
}
public Dimension getMaximumSize() {
return . . .
}
public Dimension getPreferredSize() {
return . . .;
}
Exemplu: Sa definim o plansa pe care desenam un patrat si cercul sau circumscris.
Plansa o vom afisa apoi pe o fereastra.
import java.awt.*;
class Plansa extends Canvas {
Dimension canvasSize = new Dimension(100, 100);
public void paint(Graphics g) {
g.setColor(Color.red);
g.drawRect(0, 0, 100, 100);
g.setColor(Color.blue);
g.drawOval(0, 0, 100, 100);
}
public Dimension getMinimumSize() {
return canvasSize;
}
public Dimension getPreferredSize() {
return canvasSize;
}
}
class Fereastra extends Frame {
public Fereastra(String titlu) {
super(titlu);
setSize(200, 200);
add(new Plansa(), BorderLayout.CENTER);
}
}
public class TestCanvas {
public static void main(String args[]) {
Fereastra f = new Fereastra("Test Paint");
f.show();
}
}
Clasa Graphics pune la dispozitie metode pentru:
Color getColor() void setColor(Color c)
Font getFont() void setFont(Font f)
translate(int x, int y)
Shape getClip() void setClip(Shape s) void setClip(int x, int y, int width, int height)
void setXorMode(Color c1) - desenare "sau exclusiv" void setPaintMode(Color c1) - supradesenare
drawString(String str, int x, int y) drawBytes(bytest data, int offset, int length, int x, int y) drawChars(charst data, int offset, int length, int x, int y)unde x si y reprezinta coltul din stânga-jos al textului. Textul desenat va avea culoarea curenta a contextului grafic.
drawLine(int x1, int y1, int x2, int y2) drawPolyline(intst xPoints, intst yPoints, int nPoints)
drawRect(int x, int y, int width, int height) fillRect(int x, int y, int width, int height) clearRect(int x, int y, int width, int height)
draw3DRect(int x, int y, int width, int height, boolean raised) fill3DRect(int x, int y, int width, int height, boolean raised)
drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight
drawOval(int x, int y, int width, int height) fillOval(int x, int y, int width, int height)
drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
drawPolygon(intst xPoints, intst yPoints, int nPoints) drawPolygon(Polygon p) fillPolygon(intst xPoints, intst yPoints, int nPoints) fillPolygon(Polygon p)
Cei mai importanti parametri ce caracterizeaza un font sunt:
Font(String name, int style, int size)Stilul unui font este specificat prin intermediul constantelor :
Font.PLAIN - normal
Font.BOLD - îngrosat
Font.ITALIC - înclinat
Exemple:
new Font("Arial", Font.BOLD, 12);
new Font("Times New Roman", Font.ITALIC, 14);
new Font("Courier New", Font.PLAIN, 10);
Folosirea unui obiect de tip Font se realizeaza uzual astfel:
//pentru componente etichetate
Label label = new Label("Text Java");
label.setFont(new Font("Arial", Font.BOLD, 12));
//in metoda paint(Graphics g)
g.setFont(new Font("Times New Roman", Font.ITALIC, 14));
g.drawString("Text Java", 0, 0);
O platforma de lucru are instalate, la un moment dat, o serie întreaga de fonturi care sunt
disponibile pentru scrierea textelor. Lista acestor fonturi se poate obtine cu metoda
getAllFonts a clasei GraphicsEnvironment astfel:
Font[] fonturi = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();Exemplul urmator afiseaza lista primelor 20 de fonturi disponibile pe platforma curenta de lucru. Textul fiecarui nume de font va fi scris cu fontul sau corespunzator.
import java.awt.*;
class Fonturi extends Canvas {
private Font[] fonturi;
Dimension canvasSize = new Dimension(400, 400);
public Fonturi() {
setSize(canvasSize);
fonturi = GraphicsEnvironment.
getLocalGraphicsEnvironment().getAllFonts();
}
public void paint(Graphics g) {
String nume;
for(int i=0; i < 20; i++) {
nume = fonturi[i].getFontName();
g.setFont(new Font(nume, Font.PLAIN, 14));
g.drawString(nume, 20, (i + 1) * 20);
}
}
public Dimension getMinimumSize() {
return canvasSize;
}
public Dimension getPreferredSize() {
return canvasSize;
}
}
class Fereastra extends Frame {
public Fereastra(String titlu) {
super(titlu);
add(new Fonturi(),BorderLayout.CENTER);
pack();
}
}
public class TestAllFonts {
public static void main(String args[]) {
Fereastra f = new Fereastra("All fonts");
f.show();
}
}
Metrica unui font consta în urmatoarele atribute pe care le au caracterele unui font:

FontMetrics(Font f).
Font f = new Font("Arial", Font.BOLD, 11);
FontMetrics fm = new FontMetrics(f);
Un context grafic pune la dispozitie o metoda speciala getFontMetrics de creare a unui
obiect de tip FontMetrics, pornind de la fontul curent al contextului grafic:
public void paint(Graphics g) {
Font f = new Font("Arial", Font.BOLD, 11);
FontMetrics fm = g.getFontMetrics();//echivalent cu
FontMetrics fm = new FontMetrics(f);
}
Cele mai uzuale metode ale clasei FontMetrics sunt cele pentru:
import java.awt.*;
class Texte extends Canvas {
Dimension canvasSize = new Dimension(700, 300);
private Stringst zile={"Luni", "Marti", "Miercuri", "Joi", "Vineri",
"Sambata", "Duminica"};
private Stringst luni = { "Ianuarie", "Februarie", "Martie", "Aprilie",
"Mai", "Iunie", "Iulie", "August",
"Septembrie", "Octombrie", "Noiembrie", "Decembrie"};
public Texte() {
setSize(canvasSize);
}
public void paint(Graphics g) {
FontMetrics fm;
int x,y;
String enum_zile = "Zilele saptamanii:",
enum_luni="Lunile anului:", text;
//alegem un font si aflam metrica sa
g.setFont(new Font("Arial", Font.BOLD, 20));
fm = g.getFontMetrics();
x = 0;
y = fm.getHeight();
g.drawString(enum_zile, x, y);
x += fm.stringWidth(enum_zile);
for(int i=0; i < zile.length; i++) {
text = zilesit;
if (i < zile.length - 1) text += ", ";
g.drawString(text, x, y);
x += fm.stringWidth(text);
}
//schimbam fontul
g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
fm = g.getFontMetrics();
x = 0;
y += fm.getHeight();
g.drawString(enum_luni, x, y);
x += fm.stringWidth(enum_luni);
for(int i=0; i < luni.length; i++) {
text = lunisit;
if (i < luni.length - 1) text += ", ";
g.drawString(text, x, y);
x += fm.stringWidth(text);
}
//schimbam fontul curent
g.setFont(new Font("Courier New", Font.BOLD, 60));
fm = g.getFontMetrics();
x = 0;
y += fm.getHeight();
g.drawString("Hello FontMetrics!", x, y);
}
public Dimension getMinimumSize() {
return canvasSize;
}
public Dimension getPreferredSize() {
return canvasSize;
}
}
class Fereastra extends Frame {
public Fereastra(String titlu) {
super(titlu);
add(new Texte(),BorderLayout.CENTER);
pack();
}
}
public class TestFontMetrics {
public static void main(String args[]) {
Fereastra f = new Fereastra("FontMetrics");
f.show();
}
}
| Color | SystemColor |
|---|---|
black blue cyan darkGray gray green lightGray magenta orange pink red white yellow | activeCaption activeCaptionBorder activeCaptionText control controlHighlight controlShadow contolText desktop menu text textHighlight window . . . |
Color rosu = Color.red; Color galben = Color.yellow; Color fundal = SystemColor.desktop;Daca nici una din aceste culori predefinite nu corespunde preferintelor noastre atunci putem crea noi culori prin intermediul constructorilor clasei Color:
Color(float r, float g, float b) Color(float r, float g, float b, float a) Color(int r, int g, int b) Color(int r, int g, int b, int a) Color(int rgb)unde r, g, b, a sunt valorile pentru rosu, verde, albastru si transparenta (alpha) iar parametrul "rgb" de la ultimul constructor reprezinta un întreg format din: bitii 16-23 rosu, 8-15 verde, 0-7 albastru.
//Exemple de folosire a constructorilor: Color alb = new Color(255, 255, 255); Color negru = new Color(0, 0, 0); Color rosu = new Color(255, 0, 0); Color rosuTransparent = new Color(255, 0, 0, 128);Metodele cele mai folosite ale clasei Color sunt:
| Color brighter() Color darker() | Creeaza o noua versiune a culorii curent mai deschisa / închisa |
| int getAlpha() int getRed() int getGreen() int getBlue() | Determina parametrii din care este alcatuita culoarea |
| int getRGB() | Determina valoarea ce reprezinta culoarea respectiva (bitii 16-23 rosu, 8-15 verde, 0-7 albastru) |
Sa consideram o aplicatie cu ajutorul careia putem vizualiza dinamic culorile
obtinute prin diferite combinatii ale parametrilor ce formeaza o culoare. Aplicatia va arata
astfel:

import java.awt.*;
import java.awt.event.*;
class Culoare extends Canvas {
public Color color = new Color(0, 0, 0, 255);
Dimension canvasSize = new Dimension(150, 50);
public Culoare() { setSize(canvasSize); }
public void paint(Graphics g) {
g.setColor(color);
g.fillRect(0, 0, canvasSize.width, canvasSize.height);
String text = "";
text += " R=" + color.getRed();
text += " G=" + color.getGreen();
text += " B=" + color.getBlue();
text += " A=" + color.getAlpha();
g.drawString(text, 0, 30);
}
public Dimension getPreferredSize() {return canvasSize; }
}
//fereastra principala
class Fereastra extends Frame implements AdjustmentListener {
private Scrollbar rValue, gValue, bValue, aValue;
private Culoare culoare;
public Fereastra(String titlu) {
super(titlu);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void initializare() {
Panel rgbValues = new Panel();
rgbValues.setLayout(new GridLayout(4, 1));
rValue = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 256);
rValue.setBackground(Color.red);
gValue = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 256);
gValue.setBackground(Color.green);
bValue = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 256);
bValue.setBackground(Color.blue);
aValue = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 256);
aValue.setValue(255);
aValue.setBackground(Color.lightGray);
rgbValues.add(rValue);
rgbValues.add(gValue);
rgbValues.add(bValue);
rgbValues.add(aValue);
rgbValues.setSize(200, 100);
add(rgbValues, BorderLayout.CENTER);
culoare = new Culoare();
add(culoare, BorderLayout.NORTH);
pack();
rValue.addAdjustmentListener(this);
gValue.addAdjustmentListener(this);
bValue.addAdjustmentListener(this);
aValue.addAdjustmentListener(this);
}
public void adjustmentValueChanged(AdjustmentEvent e) {
int r = rValue.getValue();
int g = gValue.getValue();
int b = bValue.getValue();
int a = aValue.getValue();
Color c = new Color(r, g, b, a);
culoare.color = c;
culoare.repaint();
}
}
//clasa principala
public class TestColor{
public static void main(String args[]) {
Fereastra f = new Fereastra("Color");
f.initializare();
f.show();
}
}

| Applet | Toolkit |
|---|---|
public Image getImage(URL url) public Image getImage(URL url, String fisier) | public Image getImage(URL url) public Image getImage(String fisier) |
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image1 = toolkit.getImage("imageFile.gif");
Image image2 = toolkit.getImage(
new URL("http://java.sun.com/graphics/people.gif"));
Metoda getImage nu verifica daca fisierul sau adresa specificata reprezinta o imagine
valida si nici nu încarca efectiv imaginea în memorie, aceste operatiuni fiind facute abia în
momentul în care se va realiza afisarea imaginii pentru prima data. Metoda nu face decât sa
creeze un obiect de tip Image care face referinta la o anumita imagine externa.
int getHeight(ImageObserver observer) int getWidth(ImageObserver observer)unde parametrul observer este uzual this. (despre interfata ImageObserver se va discuta ulterior)
boolean drawImage(Image img, int x, int y, ImageObserver observer) boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)unde:
Image img = Toolkit.getDefaultToolkit().getImage("taz.gif");
g.drawImage(img, 0, 0, this);
g.drawImage(img, 0, 200, 100, 100, this);
g.drawImage(img, 200, 0, 200, 400, Color.yellow, this);
Metoda drawImage returneaza true daca imaginea a fost afisata în întregime si
false în caz contrar, cu alte cuvinte metoda nu astepta ca o imagine sa fie complet
afisata ci se termina imediat ce procesul de afisare a început. Sa detaliem putin acest aspect.
boolean imageUpdate (Image img, int flags, int x, int y, int w, int h )Implementarea implicita consta într-un apel la metoda repaint pentru dreptunghiul specificat la apel si care reprezinta zona din imagine pentru care se cunosc noi informatii. Intregul flags furnizeaza informatii despre starea transferului. Aceste informatii pot fi aflate prin intermediul constantelor definite de interfata. Acestea sunt :
| ABORT | Incarcarea imaginii a fost întrerupta, înainte de completarea ei. |
| ALLBITS | Imaginea a fost încarcata complet |
| ERROR | A aparut o eroare în timpul încarcarii imaginii |
| FRAMEBITS | Totii bitii cadrului curent sunt disponibili |
| HEIGHT | Inaltimea imaginii este disponibila |
| PROPERTIES | Proprietatile imaginii sunt disponibile |
| SOMEBITS | Au fost receptionati noi pixeli ai imaginii |
| WIDTH | Latimea imaginii este disponibila |
//Exemple (flags & ALLBITS) != 0 imaginea este completa (flags & ERROR | ABORT ) != 0 a aparut o erorare sau transferul imaginii a fost întreruptMetoda imageUpdate poate fi redefinta pentru a personaliza afisarea imaginii. Pentru aceasta implementam clasei de tip Canvas, folosita pentru afisarea imaginii, metoda imageUpdate, care va fi apelata asincron de fiecare data când sunt disponibili noi pixeli.
public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) {
//se deseneaza imaginea numai daca toti bitii sunt disponibili
if (( flags & ALLBITS) != 0) { repaint(); }
//daca am toti bitii nu mai sunt necesare noi update-uri
return ( (flags & (ALLBITS | ABORT)) == 0);
}
MemoryImageSource(int w, int h, intst pixeli, int off, int scan)unde:
int w = 100;
int h = 100;
intst pix = new intsw * ht;
int index = 0;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
pixsindex++t = new Color(red, green, blue).getRGB();
}
}
img = createImage(new MemoryImageSource(w, h, pix, 0, w));
g.drawImage(img, 0, 0, this);
//g este un context grafic
public int print(Graphics g, PageFormat pf, int pageIndex)
throws PrinterException {
//descrirea imaginii obiectului ce va fi afisata la imprimanta
//poate fi un apel la metoda paint: paint(g)
if (ceva nu este in regula) {
return Printable.NO_SUCH_PAGE;
}
return Printable.PAGE_EXISTS;
}
}
Pasii care trebuie efectuati pentru tiparirea unui obiect sunt:
| 1. Crearea unei sesiuni de tiparire | PrinterJob.getPrinterJob |
| 2. Specificarea obiectului care va fi tiparit; acesta trebuie sa implementeze interfata Printable | setPrintable |
| 3. Optional, initierea unui dialog cu utilizatorul pentru precizarea unor parametri legati de tiparire | printDialog |
| 4. Tiparirea efectiva |
In exemplul urmator vom defini un obiect care are aceeasi reprezentare pe ecran cât si la imprimanta (un cerc circumscris unui patrat, însotit de un text) si vom tipari obiectul respectiv.
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
class Plansa extends Canvas implements Printable {
Dimension d = new Dimension(400, 400);
public Dimension getPreferredSize() {
return d;
}
public void paint(Graphics g) {
g.drawRect(200, 200, 100, 100);
g.drawOval(200, 200, 100, 100);
g.drawString("Hello", 200, 200);
}
public int print(Graphics g, PageFormat pf, int pi)
throws PrinterException {
if (pi >= 1) {
return Printable.NO_SUCH_PAGE;
}
paint(g);
g.drawString("Numai la imprimanta", 200, 300);
return Printable.PAGE_EXISTS;
}
}
class Fereastra extends Frame implements ActionListener {
private Plansa plansa = new Plansa();
private Button print = new Button("Print");
public Fereastra(String titlu) {
super(titlu);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
add(plansa, BorderLayout.CENTER);
Panel south = new Panel();
south.setLayout(new FlowLayout(FlowLayout.CENTER));
south.add(print);
add(south, BorderLayout.SOUTH);
print.addActionListener(this);
pack();
}
public void actionPerformed(ActionEvent e) {
//1.crearea unei sesiuni de tiparire
PrinterJob printJob = PrinterJob.getPrinterJob();
//2.stabilirea obiectului ce va fi tiparit
printJob.setPrintable(plansa);
//3.initierea dialogului cu utilizatorul
if (printJob.printDialog()) {
try {
//4.tiparirea efectiva
printJob.print();
} catch (PrinterException e) {
System.out.println("Exceptie la tiparire!");
e.printStackTrace();
}
}
}
}
public class TestPrint {
public static void main(String args[]) throws Exception {
Fereastra f = new Fer("Test Print");
f.show();
}
}
import java.io.*;
import java.awt.*;
class TestPrint {
public static void main(String args[]) throws Exception {
//pentru Windows
PrintWriter imp = new PrintWriter(new FileWriter("lpt1"));
//pentru UNIX
//PrintWriter imp = new PrintWriter(new FileWriter("/dev/lp"));
imp.println("Test imprimanta");
imp.println("ABCDE");
imp.close();
}
}
|
|
|