java_06.pdf

(212 KB) Pobierz
Microsoft Word - roz_6.doc
Jacek Rumi ń ski - J ę zyk JAVA – Rozdzia ł 6
Rozdział 6 Grafika i multimedia w Javie
6. 1 Grafika (rysunki)
6.2 Czcionki
6.3 Kolor
6.4 Obrazy
6.5 D ź wi ę ki
6.6 Java Media API
6.1 Grafika (rysunki)
Pakiet AWT zarówno w wersjach wcześniejszych jak i w wersji 2 wyposażony
jest w klasę Graphics, a od wersji 2 dodatkowo w klasę Graphics2D. Klasy te
zawierają liczne metody umożliwiające tworzenie i zarządzanie grafiką w Javie.
Podstawą pracy z grafiką jest tzw. kontekst graficzny, który jako obiekt posiada
właściwości konkretnego systemu prezentacji np. panelu. W AWT kontekst graficzny
jest dostarczany do komponentu poprzez następujące metody:
- paint
- paintAll
- update
- print
- printAll
- getGraphics
Obiekt graficzny (kontekst) zawiera informacje o stanie grafiki potrzebne dla
podstawowych operacji wykonywanych przez metody Javy. Zaliczyć tu należy
następujące informacje:
- obiekt komponentu, który będzie obsługiwany,
- współrzędne obszaru rysowania oraz obcinania,
- aktualny kolor,
- aktualne czcionki,
- aktualna funkcja operacji na pikselach logicznych (XOR lub Paint),
- aktualny kolor dla operacji XOR.
Posiadając obiekt graficzny można wykonać szereg operacji rysowania np.: Graphics
g;
g.drawLine(int x1, int y1, int x2, int y2) - rysuje linię pomiędzy współrzędnymi (x1,y1)
a (x2,y2), używając aktualnego koloru,
g.drawRect(int x, int y, int width, int height) - rysuje prostokąt o wysokości height i
szerokości width począwszy od punktu (x,y), używając aktualnego koloru,
g.drawString(String str, int x, int y) - rysuje tekst str począwszy od punktu (x,y),
używając aktualnego koloru i czcionki,
g.drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) -
wyświetla aktualnie dostępny zestaw pikseli obrazu img na tle o kolorze bgcolor,
6-3
Jacek Rumi ń ski - J ę zyk JAVA –
Jacek Rumi ń ski - J ę zyk JAVA – Rozdzia ł 6
począwszy od punktu (x,y)
g.setColor(Color c) - ustawia aktualny kolor c np. Color.red
g.setFont(Font font) - ustawia aktualny zestaw czcionek
W celu rysowania elementów grafiki konieczna jest znajomość układu współrzędnych
w ramach, którego wyznacza się współrzędne rysowania. Podstawowym układem
współrzędnych w Javie jest układ użytkownika, będący pewną abstrakcją układów
współrzędnych dla wszystkich możliwych urządzeń. Układ użytkownika definiowany
jest w sposób następujący.
Rysunek 6.1 Układ współrzędnych użytkownika
Układ współrzędnych konkretnego urządzenia może pokrywać się z układem
użytkownika lub nie. W razie potrzeby współrzędne z układu użytkownika są
automatycznie transformowane do właściwego układu współrzędnych danego
urządzenia.
Jako ciekawostkę można podać, że JAVA nie definiuje wprost metody umożliwiającej
rysowanie piksela, która w innych językach programowania służy często do
tworzenia obrazów. W Javie nie jest to potrzebne. Do tych celów służą liczne metody
drawImage(). Niemniej łatwo skonstruować metodę rysującą piksel np.
drawP i ixe l l(Co l lor c, i int x, i int y){
setCo l lor(c);
drawL i ine(x,y,x,y);
}
Pierwotne wersje AWT definiują kilka obiektów geometrii jak np. Point, Rectangle.
Elementy te są bardzo przydatne dlatego, że, co jest właściwe dla języków
obiektowych, nie definiujemy za każdym razem prostokąta za pomocą atrybutów
opisowych (współrzędnych) lecz przez gotowy obiekt - prostokąt, dla którego znane
są (różne metody) jego liczne właściwości.
Poniższa aplikacja umożliwia sprawdzenie działania prostych metod graficznych:
Przykład 6.1:
//Rysunki.java:
import java.awt.event.*;
6-4
Jacek Rumi ń ski - J ę zyk JAVA –
6205261.001.png
Jacek Rumi ń ski - J ę zyk JAVA – Rozdzia ł 6
import java.awt.*;
public class Rysunki extends Frame {
Rysunki () {
super ("Rysunki");
setSize(200, 220);
}
public void paint (Graphics g) {
Insets insets = getInsets();
g.translate (insets.left, insets.top);
g.drawLine (5, 5, 195, 5);
g.drawLine (5, 75, 5, 75);
g.drawRect (25, 10, 50, 75);
g.fillRect (25, 110, 50, 75);
g.drawRoundRect (100, 10, 50, 75, 60, 50);
g.fillRoundRect (100, 110, 50, 75, 60, 50);
g.setColor(Color.red);
g.drawString ("Test grafiki",50, 100);
g.setColor(Color.black);
}
public static void main (String [] args) {
Frame f = new Rysunki ();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println("Dziekujemy za prace z programem...");
System.exit(0);
}
});
f.setVisible(true);
}
}// koniec public class Rysunki extends Frame
Wykorzystana w powyższym kodzie metoda translate() zmienia początek układu
współrzędnych przesuwając go do aktywnego pola graficznego (bez ramek).
Java2D API w sposób znaczny rozszerza możliwości graficzne AWT. Po pierwsze
umożliwia zarządzanie i rysowanie elementów graficznych o współrzędnych
zmiennoprzecinkowych (float i double). Własność ta jest niezwykle przydatna dla
różnych aplikacji m.in. dla aplikacji w medycynie (wymiarowanie, planowanie terapii,
projektowanie implantów, itp.). Ta podstawowa zmiana podejścia do rysowania
obiektów graficznych i geometrycznych powoduje powstanie, nowych, licznych klas i
metod. W sposób szczególny należy wyróżnić tutaj sposób rysowania nowych
elementów. Odbywa się to poprzez zastosowanie jednej metody:
Graph i ics2D g2;
g2.draw(Shape s);
Metoda draw umożliwia narysowanie dowolnego obiektu implementującego interfejs
Shape (kształt). Przykładowo narysowanie linii o współrzędnych typu float można
wykonać w następujący sposób:
6-5
Jacek Rumi ń ski - J ę zyk JAVA –
Jacek Rumi ń ski - J ę zyk JAVA – Rozdzia ł 6
L i ine2D l l i in i ia = new L i ine2D.F l loat(20.0f, 1 10.0f, 1 100.0f, 1 10.0f);
g2.draw( l l i in i ia);
Oczywiście klasa Line2D implementuje interfejs Shape. Java2D wprowadza liczne
klasy w ramach pakietu java.awt.geom, np:
Arc2D.Double
Arc2D.Float
CubicCurve2D.Double
CubicCurve2D.Float
Dimension2D
Ellipse2D.Double
Ellipse2D.Float
GeneralPath
Line2D
Line2D.Double
Line2D.Float
Point2D
Point2D.Double
Point2D.Float
QuadCurve2D.Double
QuadCurve2D.Float
Rectangle2D
Rectangle2D.Double
Rectangle2D.Float
RoundRectangle2D.Double
RoundRectangle2D.Float
W celu skorzystania z tych oraz innych dobrodziejstw jakie wprowadza Java2D
należy skonstruować obiekt graficzny typu Graphics2D. Ponieważ Graphics2D
rozszerza klasę Graphics, to konstrukcja obiektu typu Graphics2D polega na:
Graph i ics2D g2 = (Graph i ics2D) g;
gdzie g jest obiektem graficznym otrzymywanym jak omówiono wyżej.
Uwaga! Argumentem metody paint komponentów jest obiekt klasy Graphics a nie
Graphics2D.
Dodatkowe klasy w AWT wspomagające grafikę to BasicStroke oraz TexturePaint.
Pierwsza z nich umożliwia stworzenie właściwości rysowanego obiektu takich jak np.:
szerokość linii, typ linii. Przykładowo ustawienie szerokości linii na 12 punktów
odbywać się może poprzez zastosowanie następującego kodu:
grubaL i in i ia = new Bas i icStroke( 1 12.0f);
g2.setStroke(grubaL i in i ia);
Klasa TexturePoint umożliwia wypełnienie danego kształtu (Shape) określoną
teksturą. Do dodatkowych zalet grafiki w Java2D należy zaliczyć:
- sterowanie jakością grafiki (np. antyaliasing, interpolacje)
6-6
Jacek Rumi ń ski - J ę zyk JAVA –
Jacek Rumi ń ski - J ę zyk JAVA – Rozdzia ł 6
- sterowanie przekształceniami geometrycznymi (przekształcenia sztywne - affiniczne
- klasa AffineTransform),
- sterowanie przeźroczystością elementów graficznych,
- bogate narzędzia do zarządzania czcionkami i rysowania tekstu,
- narzędzia do drukowania grafiki,
- inne.
Przykładowa aplikacja ukazująca proste elementy grafiki w Java2D
Przykład 6.2:
//Rysunki2.java:
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.*;
public class Rysunki2 extends Frame {
Rysunki2 () {
super ("Rysunki2");
setSize(200, 220);
}
public void paint (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Insets insets = getInsets();
g2.translate (insets.left, insets.top);
Line2D linia = new Line2D.Float(20.0f, 20.0f, 180.0f, 20.0f);
g2.draw(linia);
BasicStroke grubaLinia = new BasicStroke(6.0f);
g2.setStroke(grubaLinia);
g2.setColor(Color.red);
Line2D linia2 = new Line2D.Float(20.0f, 180.0f, 180.0f, 180.0f);
g2.draw(linia2);
g2.drawString ("Test grafiki",50, 100);
g2.setColor(Color.black);
}
public static void main (String [] args) {
Frame f = new Rysunki2 ();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println("Dziekujemy za prace z programem...");
System.exit(0);
}
});
f.setVisible(true);
}
} // koniec public class Rysunki2 extends Frame
6-7
Jacek Rumi ń ski - J ę zyk JAVA –
Zgłoś jeśli naruszono regulamin