Menggunakan kelas Graphics

Berbagai faktor menginspirasi orang untuk menulis program perangkat lunak. Saya percaya bahwa bagi banyak orang, motivasi muncul dari keinginan untuk membuat grafik, memanipulasi gambar, atau menghidupkan. Baik mereka ingin membuat game arcade, simulator penerbangan, atau paket CAD, pengembang sering kali memulai dengan belajar menggambar.

Kotak alat grafik dalam Abstrak Windowing Toolkit (atau AWT) memungkinkan programmer Java untuk menggambar bentuk geometris sederhana, mencetak teks, dan memposisikan gambar di dalam batas komponen, seperti bingkai, panel, atau kanvas.

Kolom ini adalah yang pertama tentang topik grafis. Ini akan fokus pada Graphicskelas dan metodenya untuk menggambar bentuk geometris sederhana, dan akan memperkenalkan proses dimana pengecatan (dan pengecatan ulang) terjadi.

Mari kita mulai dari panggung utama - Graphicskelas.

Kelas Grafik

Sangat penting bagi programmer untuk memahami Graphicskelas sebelum mereka mencoba menggambar melalui Java. The Graphicskelas menyediakan kerangka kerja untuk semua operasi grafis dalam AWT. Ini memainkan dua peran yang berbeda, tetapi terkait. Pertama, konteks grafik. Konteks grafik adalah informasi yang akan mempengaruhi operasi gambar. Ini termasuk warna latar belakang dan latar depan, font, serta lokasi dan dimensi persegi panjang kliping (wilayah komponen tempat grafik dapat digambar). Ia bahkan menyertakan informasi tentang tujuan akhirnya dari operasi grafis itu sendiri (layar atau gambar). Kedua,Graphicsclass menyediakan metode untuk menggambar bentuk geometris sederhana, teks, dan gambar ke tujuan grafik. Semua keluaran ke tujuan grafis terjadi melalui pemanggilan salah satu metode ini.

Untuk menggambar, program membutuhkan konteks grafis yang valid (diwakili oleh sebuah instance dari Graphicskelas). Karena Graphicskelas tersebut adalah kelas dasar abstrak, ia tidak dapat dibuat instance-nya secara langsung. Sebuah instance biasanya dibuat oleh sebuah komponen, dan diserahkan ke program sebagai argumen untuk metode update () dan paint () komponen . Kedua metode ini, bersama dengan metode repaint () , dibahas di bagian selanjutnya.

Metodenya

Tiga metode berikut terlibat dalam menampilkan grafik. Versi default masing-masing disediakan oleh kelas Component. Metode update () dan paint () harus didefinisikan ulang untuk melakukan operasi grafis yang diinginkan.

mengecat ulang ()

public void repaint () public void repaint (long tm) public void repaint (int x, int y, int w, int h) public void repaint (long tm, int x, int y, int w, int h)

Metode repaint () meminta agar komponen dicat ulang. Penelepon dapat meminta agar pengecatan ulang dilakukan sesegera mungkin, atau dapat menentukan periode waktu dalam milidetik. Jika jangka waktu ditentukan, operasi pengecatan akan dilakukan sebelum jangka waktu berlalu. Pemanggil juga dapat menentukan bahwa hanya sebagian dari komponen yang dicat ulang. Teknik ini berguna jika operasi pengecatan memakan waktu, dan hanya sebagian dari tampilan yang perlu dicat ulang. Kode pada Listing 1 mengilustrasikan bagaimana metode repaint () dapat digunakan dalam sebuah program.

boolean mouseDown (Peristiwa e, int x, int y) {selected_object.move (x, y); mengecat ulang (); }

Kode 1: Penangan peristiwa mouse-down

Kode di event handler mouseDown () menghitung ulang posisi objek dalam tampilan berdasarkan posisi mouse dan memanggil metode repaint () untuk menunjukkan bahwa tampilan harus dicat ulang sesegera mungkin.

memperbarui()

pembaruan kekosongan publik (Grafik g)

Metode update () dipanggil sebagai tanggapan atas permintaan pengecatan ulang () , atau sebagai tanggapan atas sebagian komponen yang dibuka atau ditampilkan untuk pertama kalinya. Argumen satu-satunya metode ini adalah turunan dari Graphicskelas. The GraphicsMisalnya hanya berlaku dalam konteks update () metode (dan setiap metode panggilan), tetapi dibuang segera setelah update () kembali metode. Implementasi default yang disediakan oleh Componentkelas menghapus latar belakang dan memanggil metode paint () (di bawah).

cat()

cat ruang kosong publik (Grafik g)
Metode paint () dipanggil dari metode update () , dan bertanggung jawab untuk benar-benar menggambar grafik. Argumen satu-satunya metode ini adalah turunan dari Graphicskelas. Implementasi default yang disediakan oleh kelas Componenttidak melakukan apa pun.

Bagaimana komponen dicat ulang

Untuk mengurangi waktu yang dibutuhkan untuk mengecat ulang tampilan, AWT mengambil dua pintasan:

  • Pertama, AWT hanya mengecat ulang komponen yang perlu dicat ulang, baik karena telah ditemukan, atau karena meminta untuk dicat ulang.


    
  • Kedua, jika sebuah komponen tertutup dan tidak tertutup, AWT mengecat ulang hanya bagian dari komponen yang sebelumnya tercakup.

Applet pada Gambar 1 memungkinkan Anda untuk mengamati proses ini saat terjadi. Abaikan sebentar area teks di bagian atas applet, dan perhatikan hanya bagian berwarna dari tampilan. Menggunakan jendela lain, tutupi sebentar lalu buka bagian applet. Perhatikan bahwa hanya bagian dari applet yang tertutup yang dicat ulang. Selain itu, hanya komponen yang tercakup yang dicat ulang, apa pun posisinya dalam hierarki komponen. Dengan sengaja menggunakan warna berbeda, applet membuat efek halus ini terlihat. Kode sumber untuk gambar ini tersedia di sini.

Gambar 1: Cat ulang browser

Sistem koordinat Grafik

Metode yang dijelaskan di bagian berikut mengambil, sebagai parameter, nilai yang menentukan bagaimana bentuk akan digambar. Misalnya, metode drawLine () mengharapkan empat parameter. Dua parameter pertama menentukan lokasi awal baris, dan dua parameter terakhir menentukan lokasi akhir baris. Nilai pasti yang akan diteruskan ke metode drawLine () ditentukan oleh sistem koordinat yang berlaku.

Sistem koordinat adalah metode untuk menentukan lokasi titik dalam ruang secara jelas. Dalam kasus AWT, ruang ini adalah permukaan dua dimensi yang disebut bidang. Setiap lokasi dalam sebuah bidang dapat ditentukan oleh dua bilangan bulat, yang disebut koordinat x dan y . Nilai koordinat x dan y dihitung berdasarkan perpindahan horizontal dan vertikal masing-masing titik dari titik awal. Dalam kasus AWT, titik asal selalu berada di pojok kiri atas bidang. Ini memiliki nilai koordinat 0 (untuk x ) dan 0 (untuk y). Ilustrasi pada Gambar 2 menunjukkan dua titik - satu terletak di titik awal, dan satu lagi terletak pada posisi tujuh berseberangan dan lima di bawah dari asal.

Gambar 2: Bidang koordinat

Grafik primitif

Bagian ini memperkenalkan metode untuk menggambar garis, persegi panjang, oval dan busur, serta poligon. Karena metode ini hanya berfungsi saat dipanggil pada Graphicsinstance yang valid , metode ini hanya dapat digunakan dalam lingkup metode update () dan paint () komponen . Sebagian besar metode berikut ini berpasangan. Satu metode (metode drawX () ) hanya menggambar garis luar dari bentuk yang ditentukan, dan metode lainnya (metode fillX () ) menggambar versi yang diisi dari bentuk yang ditentukan.

garis

void drawLine (int xBegin, int yBegin, int xEnd, int yEnd)

This is the simplest of all graphics methods. It draws a straight line, a single pixel wide, between the specified beginning and ending points. The resulting line will be clipped to fit within the boundaries of the current clipping region. The line will be drawn in the current foreground color.

The applet in Figure 3 demonstrates the drawLine() method in action. The source code is available here. This applet and the applets in Figures 4, 6, and 7 require the services of two support classes: the NewCanvas class, and the Figure interface. The NewCanvas class extends class Canvas, and provides a specialized drawing surface for figures. The source code for the NewCanvas class is available here. The Figure interface defines the methods a figure must provide in order to be used with NewCanvas. The source code for the Figure interface is available here.

Figure 3: Line drawing demonstration

rectangles
void drawRect(int x, int y, int w, int h) void fillRect(int x, int y, int w, int h) void drawRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight) void fillRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight) void draw3DRect(int x, int y, int w, int h, boolean raised) void fill3DRect(int x, int y, int w, int h, boolean raised)

Each of these graphics methods require, as parameters, the x and y coordinates at which to begin the rectangle, and the width and the height of the rectangle. Both the width and the height must be positive integers. The resulting rectangle will be clipped to fit within the boundaries of the current clipping region. The rectangle will be drawn in the current foreground color. Rectangles come in three different styles: plain, with rounded corners, and with a slight (but often hard-to-see) three-dimensional effect.

The rounded-rectangle graphics methods require two additional parameters, an arc width and an arc height, both of which control the rounding of the corners. The three-dimensional rectangle methods require an additional parameter that indicates whether or not the rectangle should be sunken or raised.

The applet in Figure 4 demonstrates these methods in action. The source code is available here.

Figure 4: Rectangle drawing demonstration

ovals and arcs

void drawOval(int x, int y, int w, int h) void fillOval(int x, int y, int w, int h) void drawArc(int x, int y, int w, int h, int startAngle, int arcAngle) void fillArc(int x, int y, int w, int h, int startAngle, int arcAngle)

Each of these graphics methods require, as parameters, the x and y coordinates of the center of the oval or arc, and the width and height of the oval or arc. Both the width and the height must be positive integers. The resulting shape will be clipped to fit within the boundaries of the current clipping region. The shape will be drawn in the current foreground color.

The arc graphics methods require two additional parameters, a start angle and an arc angle, to specify the beginning of the arc and the size of the arc in degrees (not radians). Figure 5 illustrates how angles are specified.

Figure 5: Angle specification

The applet in Figure 6 demonstrates these methods in action. The source code is available here.

Figure 6: Oval and arc drawing demonstration

polygons

void drawPolygon(int xPoints[], int yPoints[], int nPoints) void drawPolygon(Polygon p) void fillPolygon(int xPoints[], int yPoints[], int nPoints) void fillPolygon(Polygon p)

Polygons are shapes formed from a sequence of line segments. Each of the polygon graphics methods require, as parameters, the coordinates of the endpoints of the line segments that make up the polygon. These endpoints can be specified in either one of two ways: as two parallel arrays of integers, one representing the successive x coordinates and the other representing the successive y coordinates; or with an instance of the Polygon class. The Polygon class provides the method addPoint(), which allows a polygon definition to be assembled point by point. The resulting shape will be clipped to fit within the boundaries of the current clipping region.

The applet in Figure 7 demonstrates these methods in action. The source code is available here.

Gambar 7: Demonstrasi menggambar poligon

Kesimpulan

Percaya atau tidak, beberapa grafik sederhana primitif ini, dikombinasikan dengan semua yang telah kita bahas dalam beberapa bulan terakhir (AWT, penanganan acara, pengamat, dll.) Adalah semua yang Anda butuhkan untuk menulis banyak aplikasi yang berguna, mulai dari game ke sistem CAD. Bulan depan, saya akan mengumpulkan semua bagian ini dan menunjukkan kepada Anda apa yang saya maksud.

Tetap disini.

Todd Sundsted telah menulis program sejak komputer tersedia dalam model desktop. Meskipun awalnya tertarik untuk membangun aplikasi objek terdistribusi di C ++, Todd pindah ke bahasa pemrograman Java ketika Java menjadi pilihan yang jelas untuk hal semacam itu. Selain menulis, Todd menyediakan layanan konsultasi Internet dan Web kepada perusahaan-perusahaan di Amerika Serikat bagian tenggara. : END_BIO

Pelajari lebih lanjut tentang topik ini

  • GraphicsAPI Kelas Java

    //java.sun.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Observer dan Observable //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Antarmuka pengguna yang efektif //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java dan penanganan acara //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Pengantar AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Artikel ini, "Menggunakan kelas Grafik" awalnya diterbitkan oleh JavaWorld.