You are on page 1of 6

Interfee grafice (continuare)

Amintim. Pentru a specifica o aciune la apariia unui eveniment, trebuie mai nti s i asociem un gestionar (listener, handler). Un handler (gestionar) este un obiect al unei clase ce implementeaz interfaa tipListener sau extinde clasa tipAdapter (numai pentru tipurile Mouse i Window). Unui control grafic c i se asociaz un gestionar h astfel:
c.addtipListener(h);

unde tip este tipul aciunii asupra lui c pe care dorim s o controlm. Componente elementare
Component Button Canvas Checkbox Choice Label List Scrollbar TextComponent TextArea TextField

buton suprafa de desenare csu de opiuni list de opiuni cu alegere unic etichet list de opiuni cu alegere multipl bar de defilare arie de text cmp de text

Este posibil s atam mai muli gestionari unui aceluiai control grafic; n acest caz, declanarea evenimentului este comunicat tuturor gestionarilor. Aceasta se ntmpl de obicei dac o bun parte dintre aciunile ce trebuie ntreprinse sunt comune. Pentru aciunile specifice, trebuie ns s difereniem ntre controale grafice. Dac controalele grafice sunt de tipuri diferite, putem folosi metoda:
public Object getSource()

pentru a identifica sursa. Dac controalele grafice sunt de acelai tip, putem folosi metoda:
public String getActionCommand()

care ntoarce eticheta sursei. De asemenea, acelai handler poate fi asociat mai multor controale grafice. Exemplu Dorim s crem o interfa grafic de forma:
B1 H1 B2 H2 T

i dorim ca: 1

la apsarea butonului cu eticheta B1 s apar la ieire:


B1

S-a actionat B1 sau B2 :

la apsarea butonului cu eticheta B2 s apar la ieire: S-a actionat B1 sau B2 : B2 S-a actionat B2 sau T : B2 dac dm <Enter> cnd suntem n cmpul de text, s apar la ieire: S-a actionat B2 sau T : T dac introducem '$' oriunde n cmpul de text, s fie eliminat, iar la ieire s apar:
TextField :

textul din cmpul de text

Va fi respectat schema de mai sus, cu precizarea c pentru cmpul de text va fi considerat att tipul de eveniment Action, ct i Text.
import java.awt.*; import java.awt.event.*; public class Ex3 { public static void main(String[] args) { F f = new F(" Ex3 "); f.setSize(300,100);f.setLocation(200,200); f.setVisible(true); } } class F extends Frame { Button b1,b2; TextField txt; F(String s) { setTitle(s); setLayout(new FlowLayout()); b1 = new Button("B1"); add(b1); b2 = new Button("B2"); add(b2); txt = new TextField("",10); add(txt); Handler1 h1 = new Handler1(this); b1.addActionListener(h1); b2.addActionListener(h1); Handler2 h2 = new Handler2(this); b2.addActionListener(h2); txt.addActionListener(h2); txt.addTextListener(h2); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); } } class Handler1 implements ActionListener { F f; Handler1(F f) { this.f=f; }

public void actionPerformed(ActionEvent e) { System.out.print("S-a actionat B1 sau B2 :\t"); if(e.getActionCommand().equals("B1")) System.out.println("B1"); else System.out.println("B2"); } } class Handler2 implements ActionListener,TextListener { F f; Handler2(F f) { this.f = f; } public void actionPerformed(ActionEvent e) { System.out.print("S-a actionat B2 sau T :\t"); if(e.getSource() instanceof Button) System.out.println("B2"); else System.out.println("T"); } public void textValueChanged(TextEvent e) { String s = f.txt.getText(); if(s.contains("$")) { s = s.replace("$",""); f.txt.setText(s); System.out.println("TextField :\t" + s); } } }

Suprafee de desenare. Clasele Canvas i Graphics

Suprafeele grafice ofer facilitatea de control la nivel de pixel. Pe o astfel de suprafa se pot desena, folosind metode ale clasei Graphics, segmente de dreapt, dreptunghiuri, ovale etc.; la desenare poate fi aleas o culoare. De asemenea contururile nchise pot fi "umplute" cu o culoare. Pe o suprafa de desenare mai pot fi plasate i imagini, pot fi create propriile butoane etc. Clasa Canvas este complex, nu att direct prin metodele sale, ci mai ales prin posibilitatea de a folosi alte clase ca de exemplu cele pentru grafic bi- i tridimensional. Vom reduce ns prezentarea la cteva faciliti mai des folosite. Modul standard de creare a unei suprafee grafice const n extinderea clasei Canvas, redefinind metoda paint, ce afieaz componenta. Modificrile ulterioare devin vizibile prin invocarea metodei repaint. O suprafa grafic reprezint un dreptunghi de pixeli, cu colul din stnga sus avnd coordonatele (0,0). Este folosit un context de desenare; nu vom intra n amnunte, ci vom folosi contextul de desenare standard disponibil. Pentru clasa Canvas precizm doar urmtoarele elemente:
public class Canvas extends Component public Canvas() public paint(Graphics g)

cu meniunea c invocarea metodei paint pune la dispoziie contextul de desenare standard g. Faptul c este extins clasa Component permite captarea de evenimente specifice acestei clase, ca de exemplu Key, Mouse, MouseMotion. Prezentm n continuare cteva elemente legate de clasa Graphics. Att clasa, ct i metodele sale, au modificatorii public i abstract. Menionm c un context de desenare are ataate cteva informaii curente, printre care culoarea curent de desenare i fontul curent. Drept urmare, de exemplu trasarea unei linii i "umplerea" unui contur se fac folosind culoarea curent.
class Graphics extends Object Color getColor() void setColor(Color c)

este obinut, respectiv setat, culoarea curent de desenare;


Font getFont() void setFont(Font f)

este obinut, respectiv setat, fontul curent;


void drawLine(int x1, int y1, int x2, int y2)

este trasat un segment ntre punctele de coordonate (x1,y1) i (x2,y2);


void drawPolyline(int[] x, int[] y, int n) este trasat o linie poligonal ce trece, n ordine, prin n puncte ale cror coordonate sunt specificate n tablourile x i y; void drawRect(int x, int y, int w, int h) este trasat un dreptunghi: colul din stnga sus are coordonatele (x,y), iar limea i nlimea sa sunt w, respectiv h; void fillRect(int x, int y, int w, int h)

un dreptunghi specificat ca mai sus este "umplut" cu culoarea curent;


void drawOval(int x, int y, int w, int h)

este trasat o elips tangent la laturile dreptunghiului precizat;


void fillOval(int x, int y, int w, int h)

este umplut o elips tangent la laturile dreptunghiului precizat. Exemplu Dorim s figurm pe ecran puncte din plan (raportate la axele de coordinate) i s unim prin linii puncte consecutiv introduse.
import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; class Linii { public static void main(String[] args) { F f = new F(" Desen "); f.setSize(600,600); f.setLocation(50,50); f.setVisible(true); } } class F extends Frame { F(String s) { setTitle(s);

Grafic g = new Grafic(); add(g); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); } } class Grafic extends Canvas { public void paint(Graphics g) { g.translate(300,300); g.setColor(Color.red); g.drawLine(-300,0,300,0); g.drawLine(0,-300,0,300); g.setColor(Color.BLACK); Scanner sc=null; try { sc = new Scanner( new FileInputStream("in.txt") ); int xa,ya,x,y; xa = Math.round(20*sc.nextFloat()); ya = Math.round(20*sc.nextFloat()); while( sc.hasNextFloat() ) { x = Math.round(20*sc.nextFloat()); y = Math.round(20*sc.nextFloat()); g.drawRect(x,y,1,1); g.drawLine(xa,ya,x,y); xa=x; ya=y; } } catch(FileNotFoundException e) { System.out.println("Fisier inexistent"); } } } in.txt -10 -10 -10 -4 -1 -8 -1 3 10 8 10 -5

Suplimentar Exemplu Graphics2D


import java.awt.*; import java.awt.event.*; import java.awt.geom.*; class Test2D extends Frame{ Canvas2d c2d; Test2D(){ super("Test 2D"); c2d=new Canvas2d(); add(c2d); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } public static void main(String ar[]){ Test2D t=new Test2D(); t.setSize(400,400); t.setLocation(100,100); t.setVisible(true); } } class Canvas2d extends Canvas{ public void paint(Graphics g){ Graphics2D g2=(Graphics2D)g; Dimension d=getSize(); int x1,y1,x2,y2,ctrlx1, ctrly1, ctrlx2, ctrly2; x1=10; y1=10; x2=d.width-10; y2=10; Line2D l1=new Line2D.Double(x1,y1,x2,y2); g2.draw(l1); Line2D l2=new Line2D.Double(new Point2D.Double(x1,y1+5), Point2D.Double(x2,y2+5)); g2.draw(l2); x1=50; y1=50; x2=d.width-50; y2=50; ctrlx1=100; ctrly1=120; QuadCurve2D q = new QuadCurve2D.Float(); q.setCurve(x1, y1, ctrlx1, ctrly1, x2, y2); g2.draw(q); x1=50; y1=150; x2=d.width-50; y2=150; ctrlx1=80; ctrly1=60; ctrlx2 =100; ctrly2=280; CubicCurve2D c = new CubicCurve2D.Double(); c.setCurve(x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2); g2.draw(c); GeneralPath arbShape = new GeneralPath(); arbShape.moveTo (110,250); arbShape.lineTo(200,250); arbShape.lineTo(160,300); arbShape.moveTo(150,300); arbShape.lineTo(110,250); arbShape.closePath(); g2.draw(arbShape); } }

new

You might also like