[ Pobierz całość w formacie PDF ]
/**
* Klasa abstrakcyjna Plotter. Należy tworzyć jej klasy
* potomne obsługujące różnego typu plotery:
* X, DOS, Penman, HP i tak dalej.
*
* Układ współrzędnych: X = 0 z lewej strony, wartości współrzędnych rosną
* ku prawej; Y = 0 u góry, wartości współrzędnych rosną ku dołowi rysunku
* (tak samo jak w AWT).
*/
public abstract class Plotter {
public final int MAXX = 800;
public final int MAXY = 600;
/** Bieżąca współrzędna X (ten sam sposób wykorzystania jak w AWT!). */
protected int curx;
/** Current Y co-ordinate (ten sam sposób wykorzystania jak w AWT!). */
protected int cury;
/** Bieżący stan: u góry lub na dole. */
protected boolean penIsUp;
/** Aktualnie używany kolor. */
protected int penColor;
Plotter() {
penIsUp = true;
curx = 0; cury = 0;
}
abstract void rmoveTo(int incrx, int incry);
abstract void moveTo(int absx, int absy);
8.11. Program Plotter 275
abstract void penUp();
abstract void penDown();
abstract void penColor(int c);
abstract void setFont(String fName, int fSize);
abstract void drawString(String s);
/* Metody nieabstrakcyjne. */
/** Rysujemy prostokąt o szerokości w i wysokości h. */
public void drawBox(int w, int h) {
penDown();
rmoveTo(w, 0);
rmoveTo(0, h);
rmoveTo(-w, 0);
rmoveTo(0, -h);
penUp();
}
/** Rysujemy prostokąt na podstawie obiektu Dimension
* określającego wymiary prostokąta. Klasa ta jest dostępna
* w bibliotece AWT.
*/
public void drawBox(java.awt.Dimension d) {
drawBox(d.width, d.height);
}
/** Rysujemy prostokąt na podstawie obiektu Rectangle
* określającego wymiary prostokąta. Klasa ta jest dostępna
* w bibliotece AWT.
*/
public void drawBox(java.awt.Rectangle r) {
moveTo(r.x, r.y);
drawBox(r.width, r.height);
}
}
W powyższej klasie warto zwrócić uwagę na sporą grupę metod abstrakcyjnych. Meto-
dy odpowiadające za poruszanie piórem, jego kontrolę oraz rysowanie zostały zdefi-
niowane jako metody abstrakcyjne, ze względu na możliwość realizacji tych czynności
na wiele różnych sposobów. Jednak metoda rysująca prostokąt (drawBox()) posiada
domyślną implementację, która powoduje opuszczenie pióra w ostatnim wybranym
położeniu, narysowanie czterech krawędzi prostokąta i podniesienie pióra. Klasy po-
tomne obsługujące bardziej inteligentne plotery zapewne przesłonią tę metodę, jednak
klasy reprezentujące mniej zaawansowane urządzenia mogą korzystać z tej domyślnej
implementacji. Dostępne są także dwie przeciążone wersje metody drawBox(), z któ-
rych można skorzystać, gdy wymiary prostokąta są określone za pomocą obiektu Di-
mension lub gdy jego położenie i wymiary opisuje obiekt Rectangle.
Poniższy prosty program przedstawia sposób wykorzystania klas potomnych klasy
Plotter. Metoda Class.forName() wywoływana na początku programu głównego
zostanie dokładniej opisana w recepturze 25.3. Jak na razie wystarczy, abyś wiedział, że
powoduje ona utworzenie obiektu podanej klasy, który w naszym przypadku jest zapi-
sywany w zmiennej r i używany do sporządzenia rysunku:
276 Rozdział 8. Techniki obiektowe
/** Program główny, "sterownik" dla klasy Plotter.
* Program symuluje większe aplikacje graficzne, takie jak GnuPlot.
*/
public class PlotDriver {
/** Tworzymy obiekt (sterownik) Plotter i sprawdzamy, jak działa. */
public static void main(String[] argv)
{
Plotter r ;
if (argv.length != 1) {
System.err.println("Sposób użycia: PlotDriver driverclass");
return;
}
try {
Class c = Class.forName(argv[0]);
Object o = c.newInstance();
if (!(o instanceof Plotter))
throw new ClassNotFoundException("To nie jest instanceof
Plotter.");
r = (Plotter)o;
} catch (ClassNotFoundException e) {
System.err.println("Przykro mi, "+argv[0]+" nie jest klasą
reprezentującą ploter.");
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
r.penDown();
r.penColor(1);
r.moveTo(200, 200);
r.penColor(2);
r.drawBox(123, 200);
r.rmoveTo(10, 20);
r.penColor(3);
r.drawBox(123, 200);
r.penUp();
r.moveTo(300, 100);
r.penDown();
r.setFont("Helvetica", 14);
r.drawString("Witaj Zwiecie");
r.penColor(4);
r.drawBox(10, 10);
}
}
W kilku dalszych rozdziałach przedstawię kolejne przykłady wykorzystujące klasę
Plotter oraz inne klasy z nią związane.
[ Pobierz całość w formacie PDF ]