Gli applet

Con gli applet possiamo disegnare in una finestra.

Non andiamo nel dettaglio.


Parti che servono per eseguire un applet

  1. una pagine html
  2. un programma Java

La pagina html

Può essere fatta cosí:

<html>
<head></head>
<body>

<applet code="PrimoApplet.class" height=500
width=500></applet>

</body>
</html>

Cosa fare:

notepad PrimoApplet.html

Scrivere la pagina html con il codice sopra.

Dopo code va scritto il nome del programma Java tradotto, ossia quello che ha .class al posto di .java


Il programma Java

È un pò diverso dai programmi visti fino a questo momento:

import java.applet.*;
import java.awt.*;

public class PrimoApplet extends Applet {
  public void paint(Graphics g) {
    g.drawLine(0,0,200,200);
  }
}

Vediamo le differenze una per una.


Import

È necessario importare java.applet, perchè contiene delle classi che ci servono.


La definizione della classe

public class PrimoApplet extends Applet

Ricordate la parte extends Applet

Serve perchò esiste un applet standard, (che non disegna niente).

Lo estendiamo dicendo cosa va disegnato.


Non c'è il main

Al posto di public .. main.. abbiamo:

  public void paint(Graphics g) {
    // istruzioni
  }

Sia main che paint sono due metodi.

main
metodo che viene invocato quando si esegue un programma da linea di comando
paint
metodo che viene invocato per disegnare la finestra quando il programma viene eseguito da dentro una pagina html

Se si fa java NomeProgramma, vengono eseguite le istruzioni del metodo main

Se si fa appletviewer pagina.html e la pagina contiene un applet, vengono eseguite le istruzioni di paint


Le istruzioni di paint

Ci possiamo mettere tutte le istruzioni solite.

System.out.println si può usare, ma non ha effetto (non stampa niente)

Possiamo usare delle nuove istruzioni di disegno.


Cosa succede?

Voi:

A questo punto, lui:


Cosa succede?

Viene aperta questa finestra:


Origine

L'origine degli assi è il punto in alto a sinistra.

Per valori di y crescenti, il punto si sposta verso il basso.


Graphics g

L'oggetto g modella la finestra, in cui posso disegnare.

È come quando ho un file f: un oggetto che rappresenta un file. Qui ho un oggetto che rappresenta la finestra.


Esercizio: disegnare una serie di linee

Disegnare una serie di linee orizzontali a distanza 20

La dimensione della finestra è quella scritta nella pagina html


Soluzione: una linea

La singola linea orizzontale ad altezza y si disegna con:

  g.drawLine(0,y,500,y);

Soluzione completa

L'istruzione di disegno di una singola linea va ripetuta per y che va da 0 a 500

import java.applet.*;
import java.awt.*;

public class Linee extends Applet {
  public void paint(Graphics g) {
    int y;

    for(y=0; y<=500; y=y+20)
      g.drawLine(0,y,500,y);
  }
}

Non dimenticate di scrivere il file Linee.html!


Disegnare oggetti

Abbiamo visto punti e rettangoli.

Abbiamo altri oggetti, che però hanno coordinate reali.

Li vedremo un'altra volta.


Esercizio: disegnare dei quadrati

Realizzare il seguente disegno: i quadrati hanno lato 10 e distanza 10 l'uno dall'altro.

  g.drawRect(x, y, larghezza, altezza);

Soluzione: un rettangolo

Tutti i rettangoli hanno gli stessi lati:

        g.drawRect(x,y,10,10);

Disegna un rettangolo con lati 10 e punto in alto a destra in posizione x,y


Soluzione: una fila di rettangoli

Voglio ripetere il disegno del rettangolo per x=0,20,40,...500

    for(x=0; x<500; x=x+20) 
      g.drawRect(x,y,10,10);

Disegna la fila di rettangoli all'altezza data da y


Soluzione: programma completo

Devo ripetere il disegno per y=0,20,40,...,500

import java.applet.*;
import java.awt.*;

public class Rettangoli extends Applet {
  public void paint(Graphics g) {
    int x, y;

    for(y=0; y<500; y=y+20)
      for(x=0; x<500; x=x+20) 
        g.drawRect(x,y,10,10);
  }
}

Ellissi

  g.drawOval(x,y,w,h)

Disegna l'ellisse inscritta nel rettangolo.


Esercizio

Disegnare il cerchio con centro in coordinate (100,100) e raggio 40.


Soluzione sbagliata

Non posso usare le coordinate del centro come primi due argomenti di drawOval

  // sbagliato!

  g.drawRect(100,100,40,40);

Soluzione

Il rettangolo in cui il centro è inscritto ha coordinate (x_centro - raggio, y_centro -raggio)

I lati del rettangolo sono 2*raggio.


Olimpiadi

Fare questo disegno:


Soluzione

import java.awt.*;

public class Olimpiadi extends java.applet.Applet {
  public void paint(Graphics g) {
    /* i tre cerchi di sopra */
    g.drawOval(0, 0, 20, 20);
    g.drawOval(20, 0, 20, 20);
    g.drawOval(40, 0, 20, 20);

    /* i tre cerchi di sotto */
    g.drawOval(10, 10, 20, 20);
    g.drawOval(30, 10, 20, 20);
  }
}