Menggunakan kelas Grafik

Pelbagai faktor memberi inspirasi kepada orang untuk menulis program perisian. Saya percaya bahawa bagi banyak orang, motivasi berasal dari keinginan untuk membuat grafik, untuk memanipulasi gambar, atau untuk menghidupkan. Sama ada mereka mahu membuat permainan arked, simulator penerbangan, atau pakej CAD, pemaju sering memulakan dengan belajar melukis.

Kotak alat grafik di dalam Abstract Windowing Toolkit (atau AWT) memungkinkan pengaturcara Java untuk melukis bentuk geometri sederhana, mencetak teks, dan meletakkan gambar dalam batas komponen, seperti bingkai, panel, atau kanvas.

Ruangan ini adalah yang pertama saya mengenai topik grafik. Ia akan memberi tumpuan kepada Graphicskelas dan kaedahnya untuk melukis bentuk geometri sederhana, dan akan memperkenalkan proses di mana lukisan (dan pengecatan) berlaku.

Mari kita mulakan di peringkat tengah - Graphicskelas.

Kelas Grafik

Adalah penting agar pengaturcara memahami Graphicskelas sebelum mereka berusaha melukis gambar melalui Java. The Graphicskelas menyediakan rangka kerja untuk semua operasi grafik dalam AWT itu. Ia memainkan dua peranan yang berbeza, tetapi berkaitan. Pertama, ia adalah konteks grafik. Konteks grafik adalah maklumat yang akan mempengaruhi operasi melukis. Ini termasuk warna latar dan latar depan, fon, dan lokasi dan dimensi segi empat tepat kliping (kawasan komponen di mana grafik dapat dilukis). Ia juga merangkumi maklumat mengenai tujuan akhirnya operasi grafik itu sendiri (skrin atau gambar). Kedua,Graphicskelas menyediakan kaedah untuk melukis bentuk, teks, dan gambar geometri yang mudah ke destinasi grafik. Semua output ke destinasi grafik berlaku melalui permohonan salah satu kaedah ini.

Untuk menggambar, program memerlukan konteks grafik yang sah (diwakili oleh contoh Graphicskelas). Oleh kerana Graphicskelas tersebut adalah kelas dasar abstrak, kelas tersebut tidak dapat dibuat secara langsung. Contoh biasanya dibuat oleh komponen, dan diserahkan kepada program sebagai argumen kepada kaedah pembaharuan komponen () dan cat () . Kedua kaedah ini, bersama dengan kaedah mengecat semula () , dibincangkan di bahagian seterusnya.

Kaedahnya

Tiga kaedah berikut terlibat dalam memaparkan grafik. Versi lalai masing-masing disediakan mengikut kelas Component. Kaedah kemas kini () dan cat () harus ditakrifkan semula untuk melakukan operasi grafik yang diinginkan.

mengecat semula ()

pengecatan void awam () pengecatan semula void awam (tm panjang) pengecatan semula kekosongan awam (int x, int y, int w, int h) pengecatan void awam (panjang tm, int x, int y, int w, int h)

Kaedah mengecat semula () meminta agar komponen dicat semula. Pemanggil boleh meminta pengecatan semula secepat mungkin, atau dapat menentukan jangka masa dalam milisaat. Sekiranya jangka masa ditentukan, operasi pengecatan akan berlaku sebelum jangka masa berlalu. Pemanggil juga boleh menentukan bahawa hanya sebahagian komponen yang akan dicat semula. Teknik ini berguna jika operasi cat memakan masa, dan hanya sebahagian paparan yang perlu dicat semula. Kod dalam Penyenaraian 1 menggambarkan bagaimana kaedah mengecat semula () mungkin digunakan dalam program.

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

Penyenaraian 1: Penangan acara tetikus ke bawah

Kod dalam pengendali peristiwa mouseDown () mengira semula kedudukan objek dalam paparan berdasarkan kedudukan tetikus dan memanggil kaedah mengecat semula () untuk menunjukkan bahawa paparan harus dicat semula secepat mungkin.

kemas kini ()

kemas kini kekosongan awam (Grafik g)

Kaedah kemas kini () dipanggil sebagai tindak balas terhadap permintaan pengecatan semula () , atau sebagai tindak balas terhadap sebahagian komponen yang ditemui atau dipaparkan untuk pertama kalinya. Argumen satu-satunya kaedah adalah contoh Graphicskelas. The Graphicscontoh hanya sah dalam konteks yang kemas kini () kaedah (dan mana-mana kaedah yang dipanggil), tetapi dilupuskan tidak lama lagi selepas maklumat () kaedah pulangan. Pelaksanaan lalai yang diberikan oleh Componentkelas akan menghapus latar belakang dan memanggil kaedah cat () (di bawah).

cat ()

cat kosong awam (Grafik g)
Kaedah cat () dipanggil dari kaedah kemas kini () , dan bertanggungjawab untuk benar-benar melukis grafik. Argumen satu-satunya kaedah adalah contoh Graphicskelas. Pelaksanaan lalai yang disediakan oleh kelas Componenttidak membuat apa-apa.

Bagaimana komponen dicat semula

Untuk mengurangkan masa yang diperlukan untuk mengecat semula paparan, AWT mengambil dua jalan pintas:

  • Pertama, AWT mengecat semula komponen-komponen yang perlu dicat semula, sama ada kerana ia telah ditemui, atau kerana mereka diminta untuk dicat semula.


    
  • Kedua, jika komponen ditutup dan tidak ditemui, AWT hanya mengecat bahagian komponen yang sebelumnya dilindungi.

Applet dalam Rajah 1 membolehkan anda memerhatikan proses ini semasa ia berlaku. Abaikan kawasan teks di bahagian atas applet sebentar, dan perhatikan hanya bahagian paparan berwarna. Dengan menggunakan tetingkap lain, tutup seketika dan kemudian buka bahagian applet. Perhatikan bahawa hanya bahagian applet yang dilindungi dicat semula. Selanjutnya, hanya komponen yang dilindungi dicat semula, tidak kira apa kedudukannya dalam hierarki komponen. Dengan sengaja menggunakan warna yang berbeza, applet menjadikan kesan halus ini dapat dilihat. Kod sumber untuk angka ini terdapat di sini.

Gambar 1: Penyemak imbas semula

Sistem koordinat Grafik

Kaedah yang dijelaskan dalam bahagian berikut mengambil, sebagai parameter, nilai yang menentukan bagaimana bentuk yang akan dilukis. Sebagai contoh, kaedah drawLine () menjangkakan empat parameter. Dua parameter pertama menentukan lokasi permulaan garis, dan dua parameter terakhir menentukan lokasi akhir garis. Nilai tepat yang akan dihantar ke kaedah drawLine () ditentukan oleh sistem koordinat yang berlaku.

Sistem koordinat adalah kaedah untuk menentukan secara jelas lokasi titik di ruang angkasa. Bagi AWT, ruang ini adalah permukaan dua dimensi yang disebut satah. Setiap lokasi dalam satah dapat ditentukan oleh dua bilangan bulat, yang disebut koordinat x dan y . Nilai koordinat x dan y dikira dari segi anjakan mendatar dan menegak titik dari asal. Dalam kes AWT, asalnya selalu merupakan titik di sudut kiri atas pesawat. Ia mempunyai nilai koordinat 0 (untuk x ) dan 0 (untuk y). Ilustrasi dalam Gambar 2 menunjukkan dua titik - satu terletak di tempat asal, dan satu lagi terletak pada kedudukan tujuh di seberang dan lima di bawah dari asal.

Gambar 2: satah koordinat

Primitif grafik

Bahagian ini memperkenalkan kaedah untuk melukis garis, segi empat tepat, lonjong dan busur, dan poligon. Oleh kerana kaedah ini hanya berfungsi apabila dipanggil pada Graphicscontoh yang sah , kaedah ini hanya dapat digunakan dalam ruang lingkup kaedah pembaharuan komponen () dan cat () . Sebilangan besar kaedah yang diikuti berpasangan. Satu kaedah (kaedah drawX () ) hanya melukis garis besar bentuk yang ditentukan, dan kaedah lain (kaedah fillX () ) melukis versi penuh dari bentuk yang ditentukan.

garisan

undian kekosongan (int xBegin, int yBegin, int xEnd, int

Ini adalah kaedah grafik yang paling mudah. Ia melukis garis lurus, lebar satu piksel, antara titik awal dan akhir yang ditentukan. Garis yang dihasilkan akan dipotong agar sesuai dengan batas kawasan pemotongan semasa. Garisan akan dilukis dengan warna latar depan semasa.

Applet dalam Rajah 3 menunjukkan kaedah drawLine () dalam tindakan. Kod sumber terdapat di sini. Applet ini dan applet dalam Gambar 4, 6, dan 7 memerlukan perkhidmatan dua kelas sokongan: kelas NewCanvas, dan antara muka Figure. Kelas NewCanvas memperluas kelas Canvas, dan menyediakan permukaan lukisan khusus untuk angka. Kod sumber untuk kelas NewCanvas boleh didapati di sini. Antaramuka Rajah menentukan kaedah yang mesti disediakan oleh tokoh untuk digunakan dengan NewCanvas. Kod sumber untuk antara muka Rajah boleh didapati di sini.

Gambar 3: Demonstrasi lukisan garisan

segi empat tepat
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 arc Lebar, int arc Tinggi void fillRoundRect (int x, int y, int w, int h, int arcWidth, int arcHeight) draw void3DRect (int x, int y, int w, int h, boolean raise) kekosongan3DRect (int x, int y, int w, int h, boolean dinaikkan)

Setiap kaedah grafik ini memerlukan, sebagai parameter, koordinat x dan y untuk memulakan segi empat tepat, dan lebar dan tinggi segi empat tepat. Lebar dan tinggi mestilah bilangan bulat positif. Segi empat tepat yang dihasilkan akan dipotong agar sesuai dengan batas kawasan guntingan semasa. Segi empat tepat akan dilukis dengan warna latar depan sekarang. Segi empat tepat terdapat dalam tiga gaya yang berbeza: polos, dengan sudut bulat, dan dengan kesan tiga dimensi yang sedikit (tetapi sering sukar dilihat).

Kaedah grafik segi empat bulat memerlukan dua parameter tambahan, lebar lengkok dan tinggi lengkok, yang keduanya mengawal pembundaran sudut. Kaedah segi tiga tiga dimensi memerlukan parameter tambahan yang menunjukkan sama ada segi empat tepat harus tenggelam atau dinaikkan.

Applet dalam Rajah 4 menunjukkan kaedah ini dalam tindakan. Kod sumber terdapat di sini.

Gambar 4: Demonstrasi lukisan segi empat tepat

oval dan busur

kekosongan kosongOval (int x, int y, int w, int h) isian kekosongan (int x, int y, int w, int h) draw voidArc (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)

Setiap kaedah grafik ini memerlukan, sebagai parameter, koordinat x dan y dari pusat bujur atau busur, dan lebar dan tinggi bujur atau busur. Lebar dan tinggi mestilah bilangan bulat positif. Bentuk yang dihasilkan akan dipotong agar sesuai dengan batas kawasan pemotongan semasa. Bentuknya akan dilukis dengan warna latar depan.

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 lukisan poligon

Kesimpulannya

Percaya atau tidak, beberapa primitif grafik mudah ini, digabungkan dengan semua yang telah kita bahas dalam beberapa bulan terakhir (AWT, pengendalian acara, pemerhati, dan lain-lain) adalah semua yang anda perlukan untuk menulis timbunan aplikasi berguna, mulai dari permainan ke sistem CAD. Bulan depan, saya akan mengumpulkan semua kepingan ini dan menunjukkan apa yang saya maksudkan.

Nantikan.

Todd Sundsted telah menulis program sejak komputer tersedia dalam model desktop. Walaupun awalnya berminat untuk membangun aplikasi objek terdistribusi di C ++, Todd beralih ke bahasa pengaturcaraan Java ketika Java menjadi pilihan yang jelas untuk hal semacam itu. Selain menulis, Todd menyediakan perkhidmatan perundingan Internet dan Web kepada syarikat-syarikat di tenggara Amerika Syarikat. : END_BIO

Ketahui lebih lanjut mengenai topik ini

  • GraphicsAPI Kelas Java

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

  • Pemerhati dan Pemerhatian //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Antara muka pengguna yang berkesan //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java dan pengendalian acara //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Pengenalan kepada AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Kisah ini, "Menggunakan kelas Grafik" pada mulanya diterbitkan oleh JavaWorld.