Interfeţe grafice (continuare

)
Amintim. Pentru a specifica o acţiune la apariţia unui eveniment, trebuie mai întâi sǎ îi asociem un gestionar (listener, handler). Un handler (gestionar) este un obiect al unei clase ce implementeazǎ interfaţa 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 acţiunii asupra lui c pe care dorim sǎ o controlǎm. Componente elementare
Component Button Canvas Checkbox Choice Label List Scrollbar TextComponent TextArea TextField

buton suprafaţă de desenare căsuţă de opţiuni listă de opţiuni cu alegere unică etichetă listă de opţiuni cu alegere multiplă bară de defilare arie de text câmp de text

Este posibil sǎ ataşǎm mai mulţi gestionari unui aceluiaşi control grafic; în acest caz, declanşarea evenimentului este comunicată tuturor gestionarilor. Aceasta se întâmplă de obicei dacă o bună parte dintre acţiunile ce trebuie întreprinse sunt comune. Pentru acţiunile specifice, trebuie însă sǎ diferenţiem î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 acelaşi tip, putem folosi metoda:
public String getActionCommand()

care întoarce eticheta sursei. De asemenea, acelaşi handler poate fi asociat mai multor controale grafice. Exemplu Dorim să creǎm o interfaţǎ graficǎ de forma:
B1 H1 B2 H2 T

şi dorim ca: 1

awt. b2. să fie eliminat. TextField txt. F(String s) { setTitle(s). add(txt). setLayout(new FlowLayout()).*. Handler2 h2 = new Handler2(this).200). Handler1(F f) { this.b2. } } class Handler1 implements ActionListener { F f. txt.setLocation(200. să apară la ieşire: S-a actionat B2 sau T : T dacă introducem '$' oriunde în câmpul de text. import java. b1 = new Button("B1"). f.exit(0). txt. import java.addActionListener(h2).100). iar la ieşire să apară: TextField : textul din câmpul de text Va fi respectată schema de mai sus. add(b2). b2 = new Button("B2"). } } ).addActionListener(h1).f.event. } 2 .*. Handler1 h1 = new Handler1(this). b2. b1. cât şi Text.addActionListener(h2).f=f. public class Ex3 { public static void main(String[] args) { F f = new F(" Ex3 ").addActionListener(h1). cu precizarea că pentru câmpul de text va fi considerat atât tipul de eveniment Action. } } class F extends Frame { Button b1.10).awt. txt = new TextField("".setVisible(true). f. add(b1).addTextListener(h2).setSize(300. addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.- la apăsarea butonului cu eticheta B1 să apară la ieşire: B1 S-a actionat B1 sau B2 : la apăsarea butonului cu eticheta B2 să apară la ieşire: S-a actionat B1 sau B2 : B2 S-a actionat B2 sau T : B2 dacă dăm <Enter> când suntem în câmpul de text.

Clasa Canvas este complexă.println("B1").TextListener { F f. Pe o astfel de suprafaţă se pot desena..out.getActionCommand(). dreptunghiuri. redefinind metoda paint. System. pot fi create propriile butoane etc. nu atât direct prin metodele sale. cu colţul din stânga sus având coordonatele (0.contains("$")) { s = s. ce afişează componenta.0). Pentru clasa Canvas precizăm doar următoarele elemente: public class Canvas extends Component public Canvas() public paint(Graphics g) 3 . ci mai ales prin posibilitatea de a folosi alte clase ca de exemplu cele pentru grafică bi. } public void actionPerformed(ActionEvent e) { System. if(e. } } class Handler2 implements ActionListener. ci vom folosi contextul de desenare standard disponibil.getSource() instanceof Button) System.println("T"). De asemenea contururile închise pot fi "umplute" cu o culoare. Este folosit un context de desenare. Vom reduce însă prezentarea la câteva facilităţi mai des folosite.equals("B1")) System.şi tridimensională. } } }  Suprafeţe de desenare.print("S-a actionat B1 sau B2 :\t").out.out. Handler2(F f) { this.""). f.txt.print("S-a actionat B2 sau T :\t").getText().out. Modificările ulterioare devin vizibile prin invocarea metodei repaint. ovale etc. else System. Clasele Canvas şi Graphics Suprafeţele grafice oferă facilitatea de control la nivel de pixel.txt.replace("$". nu vom intra în amănunte. O suprafaţă grafică reprezintă un dreptunghi de pixeli.println("TextField :\t" + s).println("B2").public void actionPerformed(ActionEvent e) { System. segmente de dreaptă.out. if(s.println("B2"). Pe o suprafaţă de desenare mai pot fi plasate şi imagini.out. } public void textValueChanged(TextEvent e) { String s = f. la desenare poate fi aleasă o culoare.f = f. else System. Modul standard de creare a unei suprafeţe grafice constă în extinderea clasei Canvas. if(e. folosind metode ale clasei Graphics.setText(s).out.

y).setSize(600.*. fontul curent. int y. respectiv setat.util. int h) este trasată o elipsă tangentă la laturile dreptunghiului precizat. import java.*. culoarea curentă de desenare. Atât clasa. } } class F extends Frame { F(String s) { setTitle(s). class Linii { public static void main(String[] args) { F f = new F(" Desen "). int w. int h) este trasat un dreptunghi: colţul din stânga sus are coordonatele (x. class Graphics extends Object Color getColor() void setColor(Color c) este obţinută. prin n puncte ale căror coordonate sunt specificate în tablourile x şi y. Exemplu Dorim să figurăm pe ecran puncte din plan (raportate la axele de coordinate) şi să unim prin linii puncte consecutiv introduse. cât şi metodele sale.event. import java. respectiv setată.cu menţiunea că invocarea metodei paint pune la dispoziţie contextul de desenare standard g. void drawOval(int x. int y2) este trasat un segment între punctele de coordonate (x1.y1) şi (x2. int x2. au modificatorii public şi abstract. Faptul că este extinsă clasa Component permite captarea de evenimente specifice acestei clase. f. void fillRect(int x. int y.awt.50). printre care culoarea curentă de desenare şi fontul curent. int w. int y1. int h) un dreptunghi specificat ca mai sus este "umplut" cu culoarea curentă. int y. respectiv h.*.y2). void drawPolyline(int[] x.*. void drawRect(int x. de exemplu trasarea unei linii şi "umplerea" unui contur se fac folosind culoarea curentă. int w. int w. Prezentăm în continuare câteva elemente legate de clasa Graphics. Mouse. f. int[] y. Drept urmare.awt. 4 . import java. ca de exemplu Key.setVisible(true). void fillOval(int x. Font getFont() void setFont(Font f) este obţinut. MouseMotion. import java. iar lăţimea şi înălţimea sa sunt w.setLocation(50.io. int h) este umplută o elipsă tangentă la laturile dreptunghiului precizat. în ordine. int n) este trasată o linie poligonală ce trece. Menţionăm că un context de desenare are ataşate câteva informaţii curente. void drawLine(int x1. int y.600). f.

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

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

Sign up to vote on this title
UsefulNot useful