A festővászon (Canvas) használata

Forráskód: AWT_kieg03.java

1.Rész: Canvas, Graphics

(http://java.sun.com/javase/6/docs/api/java/awt/Canvas.html,

http://java.sun.com/javase/6/docs/api/java/awt/Graphics.html)

 

Az AWT Canvas („festővászon”) nevű grafikus komponense lehetőséget ad arra, hogy a felhasználói felület egy részén rajzolni lehessen. (Swing megfelelője nincs Canvas-nak. Swing esetén a JPanel-t használják ugyanerre a funkcionalitásra.) Egy rajz elkészítéséhez örökölni kell a Canvas-ból egy osztállyal, majd felül kell definiálni a paint(Graphics g) metódusát azzal a kóddal, amely tartalmazza a rajzolási feladatokat (pl.: drawLine(…), stb.). Rajzolni a paraméterként kapott Graphics típusú objektumra lehet a Graphics osztály által biztosított metódusokkal (pl.: drawLine(…), stb.)

 

Alapesetben a  paint(Graphics g) meghívása az update(Graphics g) metóduson keresztül történik. Az update(Graphics g)-t a JVM akkor hívja meg, amikor úgy érzi, hogy szükséges újrarajzolni a komponenst. Ha mi tájékoztatni szeretnénk a JVM-et, hogy szerintünk újra kell rajzolni a komponenst, akkor meghívjuk a repaint() metódusát a komponensnek. Az update(Graphics g) alapesetben a komponens alapszínnel történő letörlésért, és a paint(Graphics g) meghívásáért végzi (, de ez felüldefiniálható indokolt esetben, pl. duplabufferelés).

 

Canvas fontosabb metódusai:

 

·        void update(Graphics g)         Updates this canvas.

·        void paint(Graphics g)            Paints this canvas.

 

Duplabuffereléshez hasznos metódusok: (még nem kell ismernetek)

·        void createBufferStrategy(int numBuffers)     Creates a new strategy for multi-buffering on this component.

·        BufferStrategy getBufferStrategy()     Returns the BufferStrategy used by this component.

 

 

Graphics fontosabb metódusai:

 

Rajzolás előkészítése:

·        void setColor(Color c) Sets this graphics context's current color to the specified color.

·        Color getColor()          Gets this graphics context's current color.

·        void setFont(Font font)           Sets this graphics context's font to the specified font.

·        Font getFont() Gets the current font.

 

Vonal rajzolása: (Pont rajzolása nincs. Téglalap (Rectangle) rajzolásával oldható meg egyszerűen.)

·        void drawLine(int x1, int y1, int x2, int y2)    Draws a line, using the current color, between the points (x1, y1) and (x2, y2) in this graphics context's coordinate system.

 

"Üres" alakzatok rajzolása:

·        void drawRect(int x, int y, int width, int height)         Draws the outline of the specified rectangle.

·        void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) Draws an outlined round-cornered rectangle using this graphics context's current color.

·        void drawOval(int x, int y, int width, int height)        Draws the outline of an oval.

·        void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) Draws the outline of a circular or elliptical arc covering the specified rectangle.

·        void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)     Draws a closed polygon defined by arrays of x and y coordinates.

·        void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)     Draws a sequence of connected lines defined by arrays of x and y coordinates.

 

"Teli" alakzatok rajzolása:

·        void fillRect(int x, int y, int width, int height) Fills the specified rectangle.

·        void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)     Fills the specified rounded corner rectangle with the current color.

·        void fillOval(int x, int y, int width, int height)            Fills an oval bounded by the specified rectangle with the current color.

·        void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)    Fills a circular or elliptical arc covering the specified rectangle.

·        void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)         Fills a closed polygon defined by arrays of x and y coordinates.

 

Terület letörlése háttérszínnel:

·        void clearRect(int x, int y, int width, int height)         Clears the specified rectangle by filling it with the background color of the current drawing surface.

 

Szöveg rajzolása:

·        void drawString(String str, int x, int y)          Draws the text given by the specified string, using this graphics context's current font and color.

·        void drawBytes(byte[] data, int offset, int length, int x, int y) Draws the text given by the specified byte array, using this graphics context's current font and color.

·        void drawChars(char[] data, int offset, int length, int x, int y)           Draws the text given by the specified character array, using this graphics context's current font and color.

 

Kép rajzolása:

·        boolean drawImage(Image img, int x, int y, ImageObserver observer)          Draws as much of the specified image as is currently available.

 

Hasznos: A koordinátarendszer eltolásával sokszor könnyebb dolgozni.

·        void translate(int x, int y)       Translates the origin of the graphics context to the point (x, y) in the current coordinate system.

 

1. Példa:

import java.awt.*;

import java.awt.event.*;

 

public class AWT_kieg03 {

      public static void main(String[] args) {

            (new MyFrame03()).setVisible(true);

      }

}

 

class MyFrame03 extends Frame {

      public MyFrame03() {

            setTitle("Canvas test");

            setSize(320, 250);

            add(new MyCanvas01());

 

            // Ez csak az ablak bezárása miatt van.

            addWindowListener(new WindowAdapter() {

                  public void windowClosing(WindowEvent e) {

                        e.getWindow().dispose();

                  }

            });

      }

}

 

class MyCanvas01 extends Canvas {

      public void paint(Graphics g) {

            // Vonal és pont

            g.setColor(Color.RED);

            g.translate(5, 5);

            g.drawLine(0, 0, 50, 50);

            g.translate(55, 0);

            g.drawRect(0, 0, 1, 1);

 

            // Üres alakzatok

            g.setColor(Color.BLUE);

            g.translate(-55 * 2, 55); // Új sor

            g.drawRect(0, 0, 50, 50);

            g.translate(55, 0);

            g.drawRoundRect(0, 0, 50, 50, 8, 8);

            g.translate(55, 0);

            g.drawOval(0, 0, 50, 50);

            g.translate(55, 0);

            g.drawArc(0, 0, 50, 50, 0, 225);

            g.translate(55, 0);

            g.drawPolygon(new int[] { 0, 25, 50 }, new int[] { 0, 50, 25 }, 3);

            g.translate(55, 0);

            g.drawPolyline(new int[] { 0, 25, 50 }, new int[] { 0, 50, 25 }, 3);

 

            // Teli alakzatok

            g.setColor(Color.GREEN);

            g.translate(-55 * 5, 55); // Új sor

            g.fillRect(0, 0, 50, 50);

            g.translate(55, 0);

            g.fillRoundRect(0, 0, 50, 50, 8, 8);

            g.translate(55, 0);

            g.fillOval(0, 0, 50, 50);

            g.translate(55, 0);

            g.fillArc(0, 0, 50, 50, 0, 225);

            g.translate(55, 0);

            g.fillPolygon(new int[] { 0, 25, 50 }, new int[] { 0, 50, 25 }, 3);

            g.translate(55, 0);

 

            // Szöveg

            g.setColor(Color.RED);

            g.translate(-55 * 4, 55);

            g.drawRect(0, 0, 1, 1); //Az origót jelöli.

            g.setColor(Color.ORANGE);

            g.drawString("Ez egy szöveg", 0, g.getFontMetrics().getHeight());

      }

}

 

Kimenet: