Adam Lipowski

 Grafika w apletach

Oprócz instalowania komponentów (TextField, Button, Label,...) aplet może być wykorzystany  do rysowania. W tym celu należy zdefiniować metodę:

    public void paint(Graphics g)

Metoda paint jest wywoływana przez przeglądarkę, gdy aplet musi być narysowany, np. przy pierwszym wywołaniu strony (paint jest wywoływany zaraz po init). Argumentem metody paint jest obiekt klasy Graphics, który jest tworzony (w zasadzie) przez przeglądarkę. Argument ten może być rozumiany jako rodzaj urządzenia  wyjściowego (zwykle jest to ekran, ale może to być rownież bufor w pamięci). Aby rysować, aplet możemy uważać za siatkę z punktem (0,0) w lewym górnym rogu.

Przykłady metod z klasy Graphics:

(argumenty całkowito-liczbowe podają pewne wymiary w pikselach; 1piksel to około 1/50 cala, czyli 1/125 cm.)

g.drawLine(0,10,15,50 Rysuje linię od punktu (0,10) do (15,50).
g.drawRect(10,10,15,50) Rysuje prostokąt o lewym górnym rogu w punkcie (10,10), 15 pikselach szerokim i  50 pikselach wysokim.
g.fillRect(10,10,15,50) Rysuje taki sam prostokąt i wypełnia go aktualnym kolorem.
g.drawOval(10,10,15,50)
Rysuje elipsę wpisaną w ten sam prostokąt.
g.fillOval(10,10,15,50)
Rysuje elipsę i i wypełnia ją aktualnym kolorem.
g.drawString("Hello!",0,20)
Wypisuje string Hello! z punktem bazowym (dolny, lewy narożnik) w (0,20).
g.drawImage(im,10,20,this)
Rysuje obraz im z górnym,  lewym narożnikiem w punkcie (10,20).

           

Przykład-1: RandomCircles

Przykład-2 Oczopląs

Aplet ten reaguje na ruchy myszki implementując MouseMotionListener (tzn. musi definiować dwie metody: mouseMoved i mouseDragged). Wyświetlana część apletu jest skojarzona z obiektem klasy Graphics. Zwykle wewnątrz metody paint wysyłamy różne  wiadomości do tego obiektu. Można jednak przekazać obiekt ten do innej metody, która  dokona rysowania.

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

public class EyesApplet extends Applet
                  implements MouseMotionListener {

  // Animated eyes that follow the cursor. 
  // Author: Caitlin Little, December 27, 1996

  Point cursor;
  Eyes e1, e2;
 
  public void init () {
    // Register the Listener.
    addMouseMotionListener(this);
    setSize(500,400);
    e1 = new Eyes(new Point (63,30)); // center of one eye
    e2 = new Eyes(new Point (437,30));// center of the other
    cursor = new Point(250, 2000);    // initial cursor
  }
 
  public void paint(Graphics g) {
    e1.stare(g, cursor);
    e2.stare(g, cursor);
  }

  public void mouseMoved (MouseEvent e) {
    cursor = e.getPoint();
    repaint();
    }
 
  public void mouseDragged (MouseEvent e) {}  //  Nie będziemy używać
}  // koniec klasy  EyesApplet

class Eyes {

// Animated eyes that follow the cursor. 
 
  Point left, right, leftPupil, rightPupil;
  final int
    EYE_RADIUS = 30,
    PUPIL_RADIUS = 10;
 
  public Eyes(Point c) {
    left = new Point(c.x-EYE_RADIUS-3, c.y);
    right = new Point(c.x+EYE_RADIUS+3, c.y);
  }
 
  private void fillCircle (Graphics g,
                           Point center, int radius) {
  // Utility method: an abbreviated
  // way to draw a filled circle.
    g.fillOval(center.x-radius, center.y-radius,
               2*radius, 2*radius);
  }
 
  public void stare (Graphics g, Point cursor) {
 
    // Draw the yellow eyes
    g.setColor(Color.yellow);
    fillCircle(g, left, EYE_RADIUS);
    fillCircle(g, right, EYE_RADIUS);
 
    // Draw the pupils
    g.setColor(Color.black);
    leftPupil = compute (cursor, left);
    fillCircle(g, leftPupil, PUPIL_RADIUS);
    rightPupil = compute (cursor, right);
    fillCircle(g, rightPupil, PUPIL_RADIUS);
  }
 
  private Point compute (Point cursor, Point eye) {
  // Compute the location of the pupil, given the
  // locations of the eye and the cursor.
    double d = Math.sqrt((cursor.x-eye.x)*(cursor.x-eye.x)
                       + (cursor.y-eye.y)*(cursor.y-eye.y));
    int r = EYE_RADIUS - PUPIL_RADIUS;
    return new Point (eye.x + (int)((cursor.x-eye.x)*r/d),
                      eye.y + (int)((cursor.y-eye.y)*r/d));
  }
}



Point to klasa reprezentująca punkty (o współrzędnych x,y) np. apletu. Klasa ta posiada publiczne pola x i y. Obiekt tej klasy jest zwracany przez metodę getPoint w klasie MouseEvent.

Przykład-3 Przeglądarka do zdjęć

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class obrazek extends Applet implements ActionListener{
    Button next = new Button("Next");                 
    int i=1;
  public void init () {
      add(next);
      next.addActionListener(this);
  }
  public void actionPerformed(ActionEvent e){
      i++;
      if(i==4) i=1;
      repaint();
  }
  public void paint(Graphics g) {
      String nazwa;
      nazwa="obrazek"+i+".jpg";
    Image img = getImage(getCodeBase(),nazwa);
    g.drawImage(img,0,50,this);
  }
  }


getCodeBase() - określa katalog apletu (i zarazem zdjęć).

this - aplet (tak jak każdy komponent)  implementuje interfejs ImageObserver. Czyli każdy aplet jest zarazem obserwatorem obrazów i gdy korzystamy z metody drawImage to jako ImageObserver musimy podać this.

Tablice

Tablica to sekwencja elementów tego samego typu (prostego lub obiektowego).

Deklaracja  tablicy:

       int [] arr;  // arr jest zmienną typu int[]

Taka deklaracja nie alokuje pamięci.
Pamięć jest alokowana dynamicznie albo w wyniku incjalizacji albo poprzez użycie wyrażenia new.

      arr = new int[10];
      int [] tablica = new int[n];

Indeks(y) tablicy są typu int i zaczynają się od 0.

Przykład:

        int[] tab = new int[10]
        for (int i=0; i<=9;i++) tab[i] = i*i;

Poprawność odwołania do indeksów (sprawdzenie czy nie został przekroczony zakres)  kontrolowana jest przez Javę w trakcie wykonywania programu.

Tablice elementów obiektowych:

      int n=7;
      Button[] btab = new Button[n];
      for(int i=0;i<n;i++)
              btab[i]=new Button("Przycisk "+i);

Tablice wielowymiarowe

          int [][] tabl = new int[n][m];

- Tablice są obiektami.
- Tablice to typ zmiennych przekazywanych przez wskaźnik.  Odmiennego typu są typy proste (przekazywane przez wartość).
Przykład:
int [] a = {5,8,9};
int [] b=a;
b[0]=7;
System.out.println(a[0]); 

Co zostanie wydrukowane? Odpowiedź