Melukis teks mudah dengan tiga kelas Java
Sebagai tambahan kepada kaedah untuk melukis jenis geometri primitif seperti garis dan bulatan, Graphics
kelas menyediakan kaedah untuk melukis teks. Apabila digabungkan dengan Font
dan FontMetrics
kelas, hasilnya adalah sekumpulan alat yang membuat tugas menggambar teks menarik lebih mudah daripada yang mungkin. Lajur ini akan merangkumi setiap kelas ini secara bergilir-gilir dan akan menunjukkan kepada anda bagaimana menggunakannya bersama-sama. Namun, sebelum saya memulakan, semakan ringkas mengenai peranan Graphics
kelas adalah teratur.
Satu tinjauan
Untuk menggunakan kaedah teks Graphics
kelas, diperlukan pemahaman mengenai peranan Graphics
kelas itu sendiri. Bahagian ini memberikan gambaran ringkas mengenai fungsi dan operasi Graphics
kelas. Pembaca yang mencari liputan menyeluruh harus membaca ruangan Oktober saya, yang terdapat di sini.
The Graphics
kelas memainkan dua peranan yang berbeza tetapi berkaitan dalam toolkit windowing abstrak (AWT). Pertama, ia mengekalkan konteks grafik, yang terdiri daripada semua maklumat yang akan mempengaruhi hasil operasi grafik. Ini termasuk warna gambar, fon, dan lokasi dan dimensi segi empat tepat kliping (kawasan di mana grafik dapat dilukis). Lebih penting lagi, konteks grafik menentukan tujuan operasi grafik yang akan dibincangkan (destinasi merangkumi komponen dan gambar).
Sebagai tambahan kepada peranannya sebagai konteks grafik, Graphics
kelas ini menyediakan kaedah untuk melukis bentuk, teks, dan gambar geometri yang mudah ke tujuan grafik. Semua operasi berkaitan grafik pada komponen atau gambar berlaku melalui salah satu kaedah ini.
Untuk menggambar, program memerlukan konteks grafik yang sah (diwakili oleh contoh Graphics
kelas). Oleh kerana Graphics
kelas tersebut adalah kelas dasar abstrak, kelas tersebut tidak dapat dibuat secara langsung. Contoh biasanya dibuat oleh komponen, dan kemudian diserahkan kepada program sebagai argumen kepada komponen update()
dan paint()
kaedah. Kedua kaedah ini disebut sebagai sebahagian daripada kitaran lukisan biasa yang dimulakan dalam AWT.
The Graphics
kelas bekerja bersama-sama dengan Font
dan FontMetrics
kelas untuk menyediakan alat yang diperlukan untuk menarik teks dalam imej atau komponen. Mari mulakan dengan memeriksa kaedah Graphics
kelas untuk melukis teks.
Grafik Kelas
The Graphics
kelas menyediakan tiga kaedah yang menarik teks pada komponen atau imej.
kekosongan drawString (String str, int x, int y)
Yang drawString()
kaedah, yang ditunjukkan di bawah, mengambil sebagai parameter contoh daripada String
kelas yang mengandungi teks yang akan dikeluarkan, dan dua nilai integer menyatakan koordinat di mana teks yang harus bermula.
cat kekosongan awam (Grafik g) {g.drawString ("abc", 25, 25); }
Kod dalam penyenaraian di atas menunjukkan drawString()
kaedah yang digunakan dalam kaedah komponen paint()
. Kod dalam contoh ini menarik perkataan "abc" pada komponen yang mengandungi paint()
kaedah ini . Yang x dan y koordinat menentukan lokasi kiri sebelah bawah sudut kotak teks disertakan. Gambar 1 menunjukkan bagaimana hasilnya jika kod ini adalah sebahagian daripada objek komponen AWT yang sesuai.

kekosongan drawChars (char [] data, int offset, int panjang, int x, int y)
The drawChars()
kaedah di bawah mengambil sebagai parameter yang pelbagai watak yang mengandungi teks yang akan dikeluarkan, nilai integer yang menunjukkan mengimbangi ke dalam array di mana untuk memulakan, nilai integer yang menunjukkan bilangan aksara untuk menarik, dan dua nilai integer menyatakan koordinat di mana teks harus bermula.
cat kekosongan awam (Grafik g) {char [] rgc = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
g.drawChars (rgc, 0, 5, 25, 25); g.drawChars (rgc, 5, 5, 25, 50); }
Kod di atas menunjukkan drawChars()
kaedah yang digunakan dalam kaedah komponen paint()
. Susunan watak dilukis dalam dua bahagian. Pada pertama dari dua panggilan ke drawChars()
, parameter offset menunjukkan bahawa lukisan harus dimulakan dengan watak pertama dalam array, dan parameter panjang menunjukkan bahawa sejumlah lima watak harus dilukis pada baris pertama. Kedua dari kedua panggilan berfungsi dengan cara yang serupa tetapi menarik lima watak terakhir dalam susunan watak bermula pada kedudukan 25 piksel di bawah yang pertama. Gambar 2 menunjukkan bagaimana hasilnya jika kod ini adalah sebahagian daripada objek komponen AWT yang sesuai.

batal drawBytes (byte [] data, int offset, int panjang, int x, int y
Seperti yang ditunjukkan di bawah, drawBytes()
metode ini mengambil parameter array byte yang berisi teks yang akan dilukis, nilai bilangan bulat yang menunjukkan ofset ke array untuk memulai, nilai integer yang menunjukkan jumlah byte yang akan dilukis, dan dua nilai integer yang menentukan koordinat di mana teks harus bermula.
cat kekosongan awam (Grafik g) {byte [] rgb = {'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'};
g.drawBytes (rgb, 0, 5, 25, 25); g.drawBytes (rgb, 5, 5, 25, 50); }
Kod di atas menunjukkan drawBytes()
kaedah yang digunakan dalam kaedah komponen paint()
. Gambar 3 menunjukkan bagaimana hasilnya jika kod ini di mana bahagian objek komponen AWT yang sesuai.

Sokongan unicode
Salah satu ciri Java yang paling terkenal adalah sokongannya untuk skrip antarabangsa melalui Unicode. Sangat disayangkan bahawa perpustakaan kelas Java yang disertakan dengan versi 1.0 bahasa pengaturcaraan Java tidak sepenuhnya menyokong aspek bahasa ini. Walau bagaimanapun, nampaknya berita baik tidak lama lagi. API Pengantarabangsaan awal (lihat Sumber), yang tersedia dari SunSoft, mengatakan ini:
JDK 1.0 hanya terhad untuk memaparkan watak-watak dalam subset Latin-1 Unicode. Sekatan ini dikeluarkan dalam JDK 1.1. Program Java sekarang dapat menampilkan karakter Unicode yang dapat diberikan dengan font host. Java memberikan sebilangan kecil nama fon "maya" yang telah ditentukan dan memetakannya ke fon sebenar yang terdapat di host. Di JDK 1.0, setiap nama font Java dipetakan ke satu font host. Dalam JDK 1.1, nama font Java dapat memetakan ke rangkaian fon host. Rangkaian fon host boleh dipilih untuk merangkumi sebilangan besar set watak Unicode seperti yang dikehendaki.Penempatan teks
Kerana teks hanyalah jenis gambar lain untuk AWT, sebaris teks boleh diletakkan di mana sahaja - walaupun di atas baris teks yang lain. Kesan penempatan sembarangan, bagaimanapun, tidak semestinya menyenangkan mata. Untuk membantu pengaturcara menghasilkan teks yang menyenangkan secara estetik, definisi fon merangkumi panduan untuk penempatan baris dan watak. Garis panduan ini, jika diikuti, akan membantu menghasilkan output yang menyenangkan.
Gambar 4 mengandungi sebaris teks yang telah ditandakan untuk menunjukkan ciri-ciri yang akan kita bincangkan.

The y menyelaras parameter dalam kaedah dalam dinyatakan oleh seksyen sebelum lokasi asas daripada baris teks. Garis pangkal adalah garis di mana kebanyakan watak dalam barisan teks berehat (pengecualian adalah watak dengan keturunan seperti "g" dan "y"). Garis asasnya sebenarnya bukan ciri fon tetapi merupakan titik rujukan yang merujuk kepada semua ciri lain.
The pendakian adalah jarak dari garis dasar ke atas sebahagian besar daripada watak-watak dalam fon. Ini biasanya adalah tinggi huruf besar dalam huruf dan watak seperti "f" dan "h". Walau bagaimanapun, angka ini hanyalah garis panduan. Sebilangan watak dalam fon sebenarnya boleh melebihi jarak ini.
The keturunan ialah jarak dari garisan belakang ke bahagian bawah watak-watak dalam fon yang mempunyai descenders - watak-watak seperti "p", "g", dan "y". Seperti pendakian, angka ini hanyalah garis panduan. Sebilangan aksara dalam fon sebenarnya boleh melebihi jarak ini.
Yang terkemuka (disebut "ledding") adalah jumlah ruang antara keturunan satu baris teks dan pendakian garis di bawahnya. Ketinggian baris teks (jarak dari garis dasar satu baris teks ke garis dasar baris teks di atas atau di bawahnya) merangkumi ruang tambahan ini.
Selain ciri-ciri yang mengawal font secara keseluruhan, setiap watak dalam fon yang mempunyai terlebih dahulu . Pendahuluan menentukan berapa piksel yang memisahkan permulaan watak dari awal watak di sebelah kanan; secara ringkas, ia adalah lebar watak. Sekali lagi, sebilangan watak dalam fon sebenarnya boleh melebihi jarak ini.
Dengan menambahkan lebar semua watak dalam sebaris teks, panjang keseluruhan baris teks dapat dihitung. The FontMetrics
kelas bawah memberikan satu kaedah yang tidak hanya ini, dan banyak lagi.
FontMetrik Kelas
The FontMetrics
kelas menyediakan cara yang mudah untuk mendapatkan sekurang-ciri-ciri yang dibincangkan di atas. Berikut adalah getFontMetrics
kaedah dalam tindakan:
cat kekosongan awam (Grafik g) {FontMetrics fm = g.getFontMetrics (); . . . }
Kod di atas menunjukkan bagaimana maklumat metrik fon yang menggambarkan fon semasa dapat diperoleh. The getFontMetrics()
Cara mengembalikan atas kehendak FontMetrics
kelas. The FontMetrics
kelas menyediakan kaedah berikut:
int getAscent()
- Mengembalikan pendakian fon.
int getDescent()
- Mengembalikan keturunan fon.
int getLeading()
- Mengembalikan bahagian depan fon.
int getHeight()
- Mengembalikan ketinggian fon. Ketinggian adalah jumlah pendakian, keturunan, dan pendahuluan fon.
int charWidth(int ch)
- Mengembalikan lebar watak yang ditentukan.
int charWidth(char ch)
- Mengembalikan lebar watak yang ditentukan.
int [] getWidths()
- Mengembalikan array integer yang mengandungi lebar 256 aksara fon pertama.
Seperti disebutkan di atas, karakter yang membentuk font kadang-kadang melampaui pendakian, keturunan, dan lebar yang dilaporkan oleh kaedah di atas. Dalam kes di mana nilai tepat diperlukan, kaedah berikut disediakan.
int getMaxAscent()
- Mengembalikan pendakian maksimum fon.
int getMaxDescent()
- Mengembalikan keturunan maksimum font.
int getMaxAdvance()
- Mengembalikan lebar watak terluas dalam fon.
Kaedah berikut memberikan maklumat mengenai lebar yang diambil oleh urutan watak.
int stringWidth(String str)
- Mengembalikan lebar urutan watak.
int bytesWidth(byte [] rgb, int offset, int length)
- Mengembalikan lebar panjang urutan bait panjang bermula pada ofset .
int charsWidth(char [] rgc, int offset, int length)
- Mengembalikan lebar panjang urutan aksara panjang bermula pada ofset .
Fon Kelas
The Font
kelas merangkumi maklumat tentang fon. Fon baru dihasilkan dengan membuat contoh Font
kelas dengan nama, gaya, dan ukuran titik.
Font f = Font baru ("Dialog", Font.PLAIN, 12);
Setelah dibuat, fon dapat ditugaskan untuk contoh Graphics
objek.
g.setFont (f);
The Graphics
objek kemudian akan menggunakan fon untuk semua operasi grafik teks berikutnya yang berkaitan.
The Font
kelas menyediakan kaedah untuk mendapat sekurang-maklumat tentang font sekali ia telah dicipta.
String getName()
- Mengembalikan nama fon.
String getFamily()
- Mengembalikan nama font khas platform.
int getSize()
- Mengembalikan ukuran titik fon.
int getStyle()
- Mengembalikan gaya fon.
boolean isBold()
- Mengembalikan
true
jika fon tebal.
boolean isItalic()
- Mengembalikan
true
jika fonnya miring.
boolean isPlain()
- Kembali
true
jika fonnya kosong.
String getName()
- Mengembalikan nama fon.
Demonstrasi
Applet dalam Rajah 5 memaparkan sebaris teks dengan markup yang mencukupi untuk menunjukkan nilai metrik yang berkaitan dari bahagian di atas. Garis hitam tebal terletak di garis dasar. Dua baris tambahan menunjukkan pendakian dan penurunan fon yang dimaksudkan. Garisan menegak yang lebih kecil menunjukkan lebar watak. Tiga menu tarik-turun membolehkan anda memilih fon, gaya, dan ukuran titik.
Anda memerlukan penyemak imbas berkemampuan Java untuk melihat applet ini. Gambar 5: Penyemak imbas metrik fon interaktifApplet menggunakan Graphics
, Font
dan FontMetrics
kelas meluas. Sumbernya terdapat di sini.
Kesimpulannya
Nampaknya Graphics
kelas telah menjadi tempat yang sangat subur untuk diterokai. Dan ekspedisi belum selesai. Bulan depan saya akan mengakhiri lawatan saya ke Graphics
kelas dengan lajur mengenai kaedah sokongan imejnya, dan lajur itu akan memulakan siri kecil mengenai topik lain yang berkaitan dengan gambar dan AWT, termasuk pengeluar gambar dan pengguna gambar.
Saya ingin mengucapkan terima kasih kepada anda semua yang telah meluangkan masa untuk menulis saya dengan komen, idea, dan cadangan anda. Teruskan kerja yang bagus.
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. Todd adalah pengarang bersama Java Language API SuperBible, kini berada di kedai buku di mana sahaja. Selain menulis, Todd menyediakan perkhidmatan perundingan Internet dan Web kepada syarikat-syarikat di tenggara Amerika Syarikat.Ketahui lebih lanjut mengenai topik ini
Graphics
API Kelas ://www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html
Font
API Kelas ://www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html
FontMetrics
API Kelas ://www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html
- Menggunakan
Graphics
kelas://www.javaworld.com/javaworld/jw-11-1996/jw-11-howto.html
- API Pengantarabangsaan:
//www.javasoft.com/products/JDK/1.1/docs/guide/intl/index.html
- Tutorial Java oleh Mary Campione dan Kathy Walrath:
//www.javasoft.com/books/Series/Tutorial/index.html
Kisah ini, "Menggambar teks mudah dengan tiga kelas Java" awalnya diterbitkan oleh JavaWorld.