Język Java

Transkrypt

Język Java
Język Java
Rysowanie GUI
Określanie wyglądu komponentów
Rysowanie GUI
• Rysowanie GUI w Swingu np.
– przy pierwszym wyświetleniu
– przy ponownym odsłonięciu
– przy zmianach stanu programu
• Kolejność rysowania - zgodnie z hierarchią
komponentów
• Każdy komponent rysuje się sam
2
Kolejność rysowania GUI
• Przykład - aplikacja AplikSwing
– JFrame - rysuje ramkę
– panel z zawartością (content pane) - rysuje tło
(szary prostokąt)
– JLabel - rysuje tekst etykiety
– JButton - rysuje przycisk i ewentualny napis
3
Własności komponentu
• Komponent może być
– przezroczysty
– nieprzezroczysty (opaque) - z tłem
• Na komponencie można rysować
• Ustawianie
– kolorów
– wyglądu czcionki komponentu
– obramowania
4
Kolejność rysowania komponentu
5
Przerysowywanie komponentu
• Przerysowanie komponentu - automatyczne
• Wymuszenie przerysowania - metoda
repaint()
• W przypadku zmiany rozmiaru lub pozycji
komponentu - wywołanie metody
revalidate() przed repaint()
6
Grafika
• Podstawowe operacje graficzne np.
–
–
–
–
rysowanie linii
rysowanie figur
rysowanie znaków tekstu
wstawianie obrazów
• Operacje - zdefiniowane jako metody klasy
java.awt.Graphics
• Obiekt klasy Graphics przechowuje
aktualne ustawienia stanu graficznego
7
Grafika: rysowanie
• Rysowanie - na dowolnym komponencie
• Najczęściej - rysowanie na panelu (JPanel)
• Wszystkie polecenia rysowania w metodzie paintComponent() klasy
JComponent (konieczność przesłonięcia)
• Argument metody - obiekt klasy Graphics
8
Układ współrzędnych komponentu
x
(0,0)
(szer-1, wys-1)
y
jednostka układu współrzędnych - piksel
9
Ustalanie wymiarów komponentu
• Określanie wymiarów komponentu (metody
klasy JComponent)
int getWidth()
int getHeight()
• Rysowanie obramowania - zmniejszenie
wymiaru komponentu
• Określenie rozmiaru obramowania - metoda
getInsets(), np.
Insets b = getInsets();
s = getWidth() - b.left - b.right;
w = getHeight() - b.top - b.bottom;
10
Grafika: dostępne kształty
• Linia (Line)
• Figury
– prostokąt (Rect)
– prostokąt z efektem 3D (3DRect)
– prostokąty o zaokrąglonych brzegach
(RoundRect)
– owal - okrąg lub elipsa (Oval)
– łuk (Arc)
• Wieloboki (Polygon, Polyline)
11
Grafika: rysowanie kształtów
• Rysowanie linii
void drawLine(x1, y1, x2, y2)
• Rysowanie figur
– tylko brzegi - metoda drawXxx()
– brzegi i wypełnienie - metoda fillXxx ()
• Przykład - rysowanie prostokąta
void fillRect(xlg, ylg, szer, wys)
void drawRect(xlg, ylg, szer-1, wys-1)
• Wymiary - liczby całkowite (int)
12
Grafika: rysowanie kształtów
• Wieloboki - argument w postaci grupy par
współrzędnych x i y wierzchołków
• Owale - argumenty
– współrzędne x i y lewego górnego rogu obszaru,
w który zostanie wpisany owal
– szerokość i wysokość owalu
• Łuki - argumenty jak dla owalu oraz
– kąt, od jakiego zacznie się rysowanie łuku
– kąt określający rozpiętość łuku
13
Aplet Rysunek
import javax.swing.*;
import java.awt.*;
public class Rysunek extends JApplet {
public void init() {
panelRys mojPanel = new panelRys();
getContentPane().add(mojPanel,
BorderLayout.CENTER);
}
}
14
class panelRys extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
// tło
Insets w = getInsets();
int X = getWidth() - w.left - w.right;
int Y = getHeight() - w.top - w.bottom;
int x1 = X/4; int y1 = Y/4;
int szer = X/2; int wys = Y/2;
g.drawRect(x1, y1, szer, wys);
g.fillRect(szer, y1, x1, y1);
int x2 = x1/2; int y2 = y1/2;
g.drawLine(x1+x2, y2, x1+x2, y1+wys+y2)
}
}
15
Obrazy
• Obrazy (formaty GIF i JPEG) przechowywane jako odrębne pliki
• Obraz - obiekt klasy java.awt.Image
• Metody klasy Image zwracające wymiary
obrazu - getWidth() i getHeight()
• Umieszczanie obrazu na komponencie
– kopiowanie do komponentu
– wyświetlanie
16
Obrazy: kopiowanie (aplikacje)
• Metoda getImage() klasy java.awt.Toolkit
– Image getImage(URL url)
– Image getImage(String plik)
• Przykład
Toolkit tk;
Image rys1, rys2;
tk = Toolkit.getDefaultToolkit();
rys1 = tk.getImage("obrazek.gif");
rys2 = tk.getImage(new
URL(http://www.new.pl/rys/p1.gif));
17
Obrazy: kopiowanie (aplety)
• Metoda getImage() klasy Applet
– Image getImage(URL url)
– Image getImage(URL url, String plik)
• Metody klasy Applet zwracające obiekty klasy
URL
– getCodeBase() - adres URL katalogu z apletem
– getDocumentBase() - adres URL katalogu
z dokumentem HTML
• Przykład
Image rys =
getImage(getDocumentBase,"plik.gif");
18
Obrazy: wyświetlanie
• Wyświetlanie - metoda drawImage() klasy
Graphics
• Sposoby wyświetlania
– obraz w jego oryginalnych wymiarach
void drawImage(obraz, x, y, this);
– obraz przeskalowany
void drawImage(obraz, x, y,
szer, wys, this);
• Argumenty metody x, y - współrzędne
lewego górnego rogu obrazu
19
Aplet Obraz
import javax.swing.*; import java.awt.*;
public class Obraz extends JApplet {
public void init() {
Image obraz=getImage(getCodeBase(),
"fotki/foto.jpg");
panelObraz mojPanel = new
panelObraz(obraz);
getContentPane().add(mojPanel,
BorderLayout.CENTER);
}
}
20
class panelObraz extends JPanel {
Image obraz;
public panelObraz(Image obraz) {
this.obraz = obraz;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int a = obraz.getWidth(this);
int b = obraz.getHeight(this);
g.drawImage(obraz, 0, 0, this);
g.drawImage(obraz, a, 0,
a+10, b/2, this);
}
}
21
Widok apletu Obraz
22
Tekst
• Klasy z pakietu java.awt odpowiedzialne za
wygląd tekstu
– Font - określa rodzaj, styl i wielkość czcionki
– FontMetrics - określa szczegółowo parametry
czcionki - tzw. metrykę
(np. wysokość i szerokość liter)
• Rysowanie tekstu na komponencie
– komponenty Swingu
– metoda drawString() klasy Graphics
23
Tekst: wybór rodzaju czcionki
• Argumenty konstruktora klasy Font
– nazwa czcionki, np. "TimesRoman" ("serif"),
"Courier" ("monospaced"),
"Helvetica" ("sanserif")
– styl czcionki, np. Font.PLAIN, Font.BOLD,
Font.ITALIC (można dodawać)
– wielkość czcionki
• Jeśli użyta czcionka nie jest dostępna, Java
użyje czcionki domyślnej
• Ustawienie czcionki aktualnej - setFont()
24
Tekst: rysowanie, klasa Graphics
• Rysowanie tekstu o parametrach
określonych aktualną czcionką
void drawString("tekst", x, y)
• Przykład
Font f = new Font("TimesRoman",
Font.PLAIN, 30);
g.setFont(f);
s = "Java";
g.drawString(s, 50, 50);
25
Tekst: wymiary czcionki
Height
Xy
a
Ascent
Descent
Leading
26
Tekst: metryka czcionki
• Metody klasy FontMetrics
– stringWidth(String) - zwraca szerokość łańcucha
znaków (w pikselach)
– charWidth(char) - zwraca szerokość znaku
– getAscent()
– getDescent()
– getLeading()
– getHeight()
27
Kolory
• Kolory i metody operujące na kolorach definicje w klasie java.awt.Color
• Abstrakcyjne wzorzec koloru - kombinacja
wartości kolorów podstawowych (RGB) liczb z zakresu 0 ÷ 255, np.
Color k = new Color(100, 50, 150);
• Kolor niedostępny w systemie - zastępowany
podobnym
28
Kolory: nazwy i wartości RGB
Color.black
Color.white
Color.red
Color.green
Color.blue
Color.gray
Color.lightGgray
Color.darkGray
Color.magenta
Color.yellow
Color.cyan
Color.pink
Color.orange
0, 0, 0
255, 255, 255
255, 0, 0
0, 255, 0
0, 0, 255
128, 128, 128
192, 192, 192
64, 64, 64
255, 0, 255
255, 255, 0
0, 255, 255
255, 175, 175
255, 200, 0
29
Określanie wyglądu komponentu
• Metoda klasy JComponent ustawiająca
przezroczystość komponentu setOpaque(boolean), np. przeroczysty:
komponent.setOpaque(false);
• Kontrola przezroczystości - getOpaque()
• Metoda klasy JComponent ustawiająca
czcionkę komponentu - setFont(Font)
• Informacje o czcionce getFont(), getFontMetrics()
30
Określanie wyglądu komponentu
• Metody klasy JComponent ustawiające kolor
– setBackground(Color) - tła
– setForeground(Color) - pierwszego planu
• Analogiczne metody zwracające ustawienia
– getBackground(), getForeground()
• Ustawianie koloru, np.
komponent.setBackground(Color.red);
• Ustawianie własnego koloru, np.
Color c = new Color(150, 10, 150);
komponent.setForeground(c);
31
Aplet Kolory
import javax.swing.*; import java.awt.*;
public class Kolory extends JApplet {
public void init() {
Font c = new Font("sanserif",
Font.ITALIC, 40);
JLabel napis = new JLabel("Java",
JLabel.CENTER);
Container kont = getContentPane();
kont.add(napis);
napis.setOpaque(true);
napis.setBackground(Color.yellow);
napis.setForeground(Color.blue);
napis.setFont(c);
}
}
32
Widok apletu Kolory
33
Określanie wyglądu komponentu
• Metody klasy JComponent określające
wymiary elementu
–
–
–
–
–
–
int getWidth()
int getHeight()
Dimension getSize()
Dimension getPreferredSize()
Dimension getMaximumSize()
Dimension getMinimumSize()
• Inne metody np.
– void setPreferredSize(Dimension)
34
Obramowanie komponentu
• Dodawanie obramowania - metoda setBorder()
klasy JComponent
• Typy obramowania
(klasa javax.swing.BorderFactory)
– Line, Etched, LoweredBevel, RaisedBevel, Empty,
Matte, Titled, Compound
• Tworzenie obramowania - createXxxBorder()
• Przykład
b=BorderFactory.createLineBorder(Color.black);
komponent.setBorder(b);
35
Obramowania: rodzaje
36
Obramowania: rodzaje
37
Obramowania: rodzaje
38
Obramowania: rodzaje
39
Aplet Kropki
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class Kropki extends JApplet {
JLabel tekst = new JLabel("Kliknij
w dowolnym miejscu białego obszaru!",
JLabel.LEFT);
myszPanel panel = new myszPanel();
40
public void init() {
Container kont = getContentPane();
tekst.setOpaque(true);
tekst.setBackground(Color.yellow);
panel.setOpaque(true);
panel.setBackground(Color.white);
panel.setForeground(Color.blue);
panel.setBorder(
BorderFactory.createEtchedBorder());
}
}
kont.add(panel, BorderLayout.CENTER);
kont.add(tekst, BorderLayout.SOUTH);
41
class myszPanel extends JPanel {
Point p;
public myszPanel() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent zd)
{
int x = zd.getX(); int y = zd.getY();
if (p == null)
p = new Point(x, y);
else { p.x = x; p.y = y; }
repaint();
}
});
}
42
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (p != null)
g.fillOval(p.x-10, p.y-10, 20, 20);
}
}
43
Java 2D
• Java 2D - zbiór dodatkowych klas
dostarczających programom wysokiej
jakości grafiki dwuwymiarowej
• Java2D umożliwia m.in.
– ustalenie rodzaju wypełnienia (np. gradienty)
– ustalenie szerokości i rodzaju linii
– przesuwanie, obracanie, skalowanie tekstu i
grafiki
• Współrzędne w Java2D – typu float
44
Java 2D: Klasa Graphics2D
• Operacje rysowania grafiki - klasa Graphics
• Java2D używa obiektu klasy Graphics2D
(pakiet java.awt) konieczność rzutowania
• Przykład – metoda paintComponent()
public void paintComponent(Graphics g)
{
Graphics2D g2D=(Graphics2D)g;
// treść metody
}
45
Java 2D: metody grafiki 2D
• Wykonywanie wszystkich operacji grafiki
2D - na obiektach klasy Graphics2D, nawet
jeśli metody 2D i nie-2D sa takie same
• Przykład – definiowanie kolorów
g2D.setColor(Color.black);
• Dodatkowe klasy grafiki 2D - w pakiecie
java.awt.geom - np. Line2D, Line2D.Float,
Point2D, Rectangle2D, Rectangle2D.Float
46
Java 2D: rodzaje wypełnienia
• Wypełnianie w Java2D – metoda setPaint()
• Rodzaje wypełnień
–
–
–
–
kolorem
gradientami
teksturą
własnym wzorem
• Interfejs Paint zawiera klasy GradientPaint,
TexturePaint i Color
47
Java 2D: wypełnianie gradientami
• Konstruktory klasy GradientPaint
GradientPaint(x1,
y2,
GradientPaint(x1,
y2,
y1, kolor1, x2,
kolor2)
y1, kolor1, x2,
kolor2, true)
• Rysowanie gradientu
– początek w punkcie x1,y1 - kolor kolor1
– koniec w punkcie x2,y2 - kolor kolor2
– true określa, czy gradient ma być rysowany
cyklicznie
48
Aplet Gradient
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class Gradient extends JApplet {
public void init() {
panelRys mojPanel = new panelRys();
getContentPane().add(mojPanel,
BorderLayout.CENTER);
}
}
49
class panelRys extends JPanel {
public void paintComponent(Graphics g){
super.paintComponent(g);
Dimension d = getSize();
int s = d.width; int w = d.height;
Graphics2D g2D = (Graphics2D)g;
GradientPaint wzor = new
GradientPaint(0, 0, Color.white,
s, w,Color.blue);
g2D.setPaint(wzor);
Rectangle2D.Float pr = new
Rectangle2D.Float(0, 0, s, w);
g2D.fill(pr);
}
}
50
Widok apletu Gradient
51
Java 3D
• Java 3D - zbiór klas umożliwiających
tworzenie rzeczywistości wirtualnej,
rozszerzenie pakietu JDK
• Najważniejsze klasy Javy 3D - w pakietach
javax.media.j3d i javax.vecmath
52

Podobne dokumenty