Melukis teks mudah dengan tiga kelas Java

Sebagai tambahan kepada kaedah untuk melukis jenis geometri primitif seperti garis dan bulatan, Graphicskelas menyediakan kaedah untuk melukis teks. Apabila digabungkan dengan Fontdan FontMetricskelas, 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 Graphicskelas adalah teratur.

Satu tinjauan

Untuk menggunakan kaedah teks Graphicskelas, diperlukan pemahaman mengenai peranan Graphicskelas itu sendiri. Bahagian ini memberikan gambaran ringkas mengenai fungsi dan operasi Graphicskelas. Pembaca yang mencari liputan menyeluruh harus membaca ruangan Oktober saya, yang terdapat di sini.

The Graphicskelas 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, Graphicskelas 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 Graphicskelas). Oleh kerana Graphicskelas 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 Graphicskelas bekerja bersama-sama dengan Fontdan FontMetricskelas untuk menyediakan alat yang diperlukan untuk menarik teks dalam imej atau komponen. Mari mulakan dengan memeriksa kaedah Graphicskelas untuk melukis teks.

Grafik Kelas

The Graphicskelas 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 Stringkelas 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.

Gambar 1: Demonstrasi drawString ()

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.

Gambar 2: Demonstrasi drawChars ()

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.

Gambar 3: Demonstrasi drawBytes ()

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.

Gambar 4: Sebaris teks

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 FontMetricskelas bawah memberikan satu kaedah yang tidak hanya ini, dan banyak lagi.

FontMetrik Kelas

The FontMetricskelas menyediakan cara yang mudah untuk mendapatkan sekurang-ciri-ciri yang dibincangkan di atas. Berikut adalah getFontMetricskaedah 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 FontMetricskelas. The FontMetricskelas 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 Fontkelas merangkumi maklumat tentang fon. Fon baru dihasilkan dengan membuat contoh Fontkelas dengan nama, gaya, dan ukuran titik.

Font f = Font baru ("Dialog", Font.PLAIN, 12); 

Setelah dibuat, fon dapat ditugaskan untuk contoh Graphicsobjek.

g.setFont (f); 

The Graphicsobjek kemudian akan menggunakan fon untuk semua operasi grafik teks berikutnya yang berkaitan.

The Fontkelas 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 truejika fon tebal.

boolean isItalic()

  • Mengembalikan truejika fonnya miring.

boolean isPlain()

  • Kembali truejika 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 interaktif

Applet menggunakan Graphics, Fontdan FontMetricskelas meluas. Sumbernya terdapat di sini.

Kesimpulannya

Nampaknya Graphicskelas telah menjadi tempat yang sangat subur untuk diterokai. Dan ekspedisi belum selesai. Bulan depan saya akan mengakhiri lawatan saya ke Graphicskelas 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

  • GraphicsAPI Kelas :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • FontAPI Kelas :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • FontMetricsAPI Kelas :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Menggunakan Graphicskelas:

    //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.