Java - prosta biblioteka graficzna G

19.11.2009 - Michał Karpiński
TrudnośćTrudność

Wewnątrz biblioteki

Zanim zaprogramujesz swoją pierwszą aplikację, musisz dowiedzieć się, co znajduje się wewnątrz biblioteki a przede wszystkim — śćiągnąć ją na dysk. Potrzebny jest tylko jeden plik o nazwie G.jar, który pobierzesz stąd. Biblioteka składa się z dwóch głównych pakietów:

  • no.geosoft.cc.geometry – w tym pakiecie interesująca jest jedynie klasa Geometry, będąca zbiorem zbiorem statycznych metod, dzięki którym za pomocą jednego polecenia można skonstruować różne figury geometryczne, pozwalająca ponadto na obliczenie sumy, przekroju, odległości pomiędzy figurami itp.
  • no.geosoft.cc.graphics – zbiór klas, który tworzy silnik graficzny. Klasy tego pakietu odpowiedzialne są za renderowanie, zarządzanie warstwami, stylami i komunikację z użytkownikiem.

Oto kod Twojego pierwszego programu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.awt.*;
import javax.swing.*;
 
import no.geosoft.cc.geometry.Geometry;
import no.geosoft.cc.graphics.*;
 
public class PierwszaScena extends JFrame{
  private GWindow window;
  private GScene scene;
  private Gwiazda gwiazda;
 
  public PierwszaScena(){
    super ("Gwiazdka");
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    
    window = new GWindow (new Color (200, 230, 200));
    getContentPane().add (window.getCanvas());
  
    GScene scene = new GScene (window);
    gwiazda = new Gwiazda();
    scene.add(gwiazda);
  
    pack();
    setSize (new Dimension (500, 500));
    setVisible (true);
  }
 
  public static void main(String[] args){
    new PierwszaScena();
  }
}

Ważna uwaga: obiecałem łatwiejszy sposób renderowania grafiki, lecz nie mówiłem, że całkowicie żegnamy się ze starym Swingiem czy AWT — wciąż trzeba z nich korzystać np. żeby wyświetlić okienko.

Przyjrzyjmy się bliżej istotnym fragmentom kodu:

  • 4 i 5 linia: importujemy nowe pakiety

  • 7 linia: tutaj warto zauważyć, że PierwszaScena dziedziczy po JFrame.

  • 16 i 17 linia: tworzymy obiekt GWindow. Jest to "ojciec" wszystkich obiektów wyświetlanych na ekranie, stoi na samej górze w hierarchii. Od razu możemy podać kolor tła w konstruktorze. Samego obiektu GWindow na ekranie nie zobaczymy, za to możemy zobaczyć jego „płótno” — co w skrócie oznacza przestrzeń do rysowania. „Płótno” dodajemy do głównego okna w linii 17.

  • 19 linia: sam GWindow nie wystarcza, żeby wyświetlać obiekty. I właśnie w tym momencie pojawia się scena GScene, czyli łącznik pomiędzy obiektem GWindow a obiektami graficznymi. Scena sama w sobie jest obiektem (dziedziczy po GObject), ponadto posiada jedną ważną funkcję — definiuje prostokątny obszar, w którym będą renderowane obiekty. Ten obszar fachowo nazywa się ViewPort.

  • 20 i 21 linia: tworzymy obiekt typu Gwiazda (patrz niżej) i wstawiamy go do sceny

Przepis na gwiazdkę:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import no.geosoft.cc.geometry.Geometry;
 
public class Gwiazda extends GObject{
  private GSegment star_;
  
  public Gwiazda(){
    star_ = new GSegment();
    addSegment (star_);
  }
 
  public void draw(){
    star_.setGeometry (Geometry.createStar (220, 220, 200, 80, 15));
  }
}

Klasę Gwiazda umieszczamy w osobnym pliku lub jako klasę zagnieżdżoną w PierwszaScena.

W powyższym kodzie od razu można dostrzec nową, tajemniczą klasę GSegment (linia 4). Bez zbędnego wstępu — klasa GObject nie jest najmniejszą jednostką graficzną w bibliotece i może przechowywać elementy typu GSegment (jak również inne GObject-y). Natomiast GSegment przechowuje wielokąty, a bardziej precyzyjnie - zbiór punktów płaszczyzny tworzący dany wielokąt. Kolejny obrazek powinien rozwiać wszelkie wątpiwości:

Nasz obiekt składa się tylko z jednego segmentu. Wewnątrz konstruktora definiujemy nowy GSegment (linia 7) i następnie dodajemy go do obiektu.

Sam obiekt nie będzie nic zawierał, dopóki mu tego nie narysujemy — do tego potrzebujemy umieścić w klasie GObject metodę draw (linia 11-13). Draw to specjalna metoda, która jest wywoływana za każdym razem, kiedy "płótno" potrzebuje przerysować obiekt. Wewnątrz funkcji — za pomocą odpowiednich metod — operujemy na segmentach i podobiektach danego obiektu. W szczególności metoda draw jest odpalana podczas dodania nowego obiektu do sceny. Można też wywołać ją ręcznie przy pomocy redraw(). W naszym przykładzie kluczowa jest linia 12, w której mówimy:

"Niech segment star_ będzie gwiazdą. Umieścimy go na scenie we współrzędnych (220,220), odległość od środka figury do wierzchołka jego kątów wewnętrznych będzie równa 200 itd..."

Dokładniej - metoda statyczna createStar() tworzy zbiór punktów wielokąta o kształcie gwiazdy według podanych parametrów. Pełna definicja:

1
public static int[] createStar(int x,int y,int sIn,int sOut,int num);

Otrzymany zbiór punktów utożsamiamy ze zmienną star_ przy pomocy funkcji setGeometry. I to wszystko - nasza gwiazdka jest gotowa do wyświetlenia. Działanie funkcji createStar mogłeś już przetestować w aplecie na poprzedniej stronie.

Spis wszystkich metod klasy Geometry znajdziesz tutaj.

Oczywiście gwiazdka jest jedynie przykładem. Istnieją inne funkcje do tworzenia wielokątów (oraz elips). Można też budować własne, niestandardowe figury, wystarczy dostarczyć odpowiednim funkcjom zbiór punktów płaszczyzny przechowywany w tablicy. Zachęcam do głębszego przestudiowania klasy Geometry w pakiecie no.geosoft.cc.geometry

Jeżeli chcesz skompilować program, który korzysta z biblioteki G, skopiuj plik G.jar do folderu gdzie znajduje się kod programu i w konsoli wpisz polecenie:

javac –classpath G.jar;. NazwaPliku.java

Następnie odpal poleceniem:

java –classpath G.jar;. NazwaPliku

Uwaga: użytkownicy linuksa zamiast średnika (;) muszą wpisać dwukropek (:).

3.666665
Twoja ocena: Brak Ocena: 3.7 (3 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com