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