Menggambar teks dengan mudah dengan tiga kelas Java

Selain metode untuk menggambar tipe geometris primitif seperti garis dan lingkaran, Graphicskelas menyediakan metode untuk menggambar teks. Saat dikombinasikan dengan kelas Fontdan FontMetrics, hasilnya adalah seperangkat alat yang membuat pekerjaan menggambar teks yang menarik jauh lebih mudah daripada yang seharusnya. Kolom ini akan membahas masing-masing kelas ini secara bergiliran dan akan menunjukkan kepada Anda bagaimana menggunakannya bersama. Namun, sebelum saya mulai, tinjauan singkat tentang peran Graphicskelas sudah diatur.

Sebuah review

Untuk menggunakan metode teks Graphicskelas, diperlukan pemahaman tentang peran Graphicskelas itu sendiri. Bagian ini menyajikan gambaran singkat tentang fungsi dan operasi Graphicskelas. Pembaca yang mencari liputan menyeluruh harus membaca kolom Oktober saya, tersedia di sini.

The Graphicskelas memainkan dua peran yang berbeda tetapi terkait dalam windowing toolkit abstrak (AWT). Pertama, ia memelihara konteks grafis, yang terdiri dari semua informasi yang akan mempengaruhi hasil operasi grafis. Ini termasuk warna gambar, font, dan lokasi serta dimensi persegi panjang kliping (wilayah tempat grafik dapat digambar). Lebih penting lagi, konteks grafik menentukan tujuan untuk operasi grafik yang akan dibahas (tujuan termasuk komponen dan gambar).

Selain perannya sebagai konteks grafik, Graphicskelas menyediakan metode untuk menggambar bentuk geometris sederhana, teks, dan gambar ke tujuan grafik. Semua operasi yang berhubungan dengan grafik pada komponen atau gambar terjadi melalui 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 contoh biasanya dibuat oleh komponen, dan kemudian diserahkan ke program sebagai argumen untuk komponen update()dan paint()metode. Kedua metode ini disebut sebagai bagian dari siklus gambar normal yang dimulai dalam AWT.

The Graphicskelas bekerja sama dengan Fontdan FontMetricskelas untuk menyediakan alat yang diperlukan untuk menggambar teks dalam gambar atau komponen. Mari kita mulai dengan memeriksa metode Graphicskelas untuk menggambar teks.

Grafik Kelas

The Graphicskelas menyediakan tiga metode yang menarik teks pada komponen atau gambar.

void drawString (String str, int x, int y)

The drawString()metode, yang ditunjukkan di bawah, mengambil sebagai parameter sebuah instance dari Stringkelas yang berisi teks yang akan ditarik, dan dua nilai integer menentukan koordinat mana teks harus mulai.

public void paint (Grafik g) {g.drawString ("abc", 25, 25); }

Kode dalam daftar di atas menunjukkan drawString()metode yang digunakan dalam metode komponen paint(). Kode dalam contoh ini menggambar kata "abc" pada komponen yang berisi paint()metode ini . The x dan y koordinat menentukan lokasi dari kiri bawah sudut kotak melampirkan teks. Gambar 1 menunjukkan seperti apa hasilnya jika kode ini adalah bagian dari objek komponen AWT yang sesuai.

Gambar 1: Demonstrasi drawString ()

void drawChars (char [] data, int offset, int length, int x, int y)

The drawChars()metode di bawah ini mengambil sebagai parameter array karakter yang berisi teks yang akan ditarik, nilai integer yang menunjukkan offset ke array di mana untuk memulai, nilai integer yang menunjukkan jumlah karakter untuk menarik, dan dua nilai integer menentukan koordinat mana teks harus dimulai.

public void paint (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); }

Kode di atas menunjukkan drawChars()metode yang digunakan dalam metode komponen paint(). Array karakter digambar dalam dua bagian. Pada yang pertama dari dua panggilan ke drawChars(), parameter offset menunjukkan bahwa gambar harus dimulai dengan karakter pertama dalam larik, dan parameter panjang menunjukkan bahwa total lima karakter harus digambar pada baris pertama. Panggilan kedua dari dua panggilan bekerja dengan cara yang sama tetapi menggambar lima karakter terakhir dalam larik karakter yang dimulai pada posisi 25 piksel di bawah yang pertama. Gambar 2 menunjukkan seperti apa hasilnya jika kode ini adalah bagian dari objek komponen AWT yang sesuai.

Gambar 2: Demonstrasi drawChars ()

void drawBytes (byte [] data, int offset, int length, int x, int y)

Seperti yang ditunjukkan di bawah ini, drawBytes()metode ini mengambil parameter array byte berisi teks yang akan digambar, nilai integer yang menunjukkan offset ke dalam array untuk memulai, nilai integer yang menunjukkan jumlah byte yang akan digambar, dan dua nilai integer yang menentukan koordinat tempat teks harus dimulai.

public void paint (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); }

Kode di atas menunjukkan drawBytes()metode yang digunakan dalam metode komponen paint(). Gambar 3 menunjukkan seperti apa hasilnya jika kode ini merupakan bagian dari objek komponen AWT yang sesuai.

Gambar 3: Demonstrasi drawBytes ()

Dukungan Unicode

Salah satu fitur Java yang paling dipuji adalah dukungannya untuk skrip internasional melalui Unicode. Sangat disayangkan bahwa pustaka kelas Java yang disertakan dengan versi 1.0 dari bahasa pemrograman Java tidak sepenuhnya mendukung aspek bahasa ini. Namun, tampaknya kabar baik akan segera tiba. API Internasionalisasi awal (lihat Sumberdaya), tersedia dari SunSoft, mengatakan ini:

JDK 1.0 dibatasi untuk hanya menampilkan karakter dalam subset Latin-1 dari Unicode. Pembatasan ini dihapus di JDK 1.1. Program Java sekarang akan dapat menampilkan karakter Unicode apa pun yang dapat dirender dengan font host. Java menyediakan sejumlah kecil nama font "virtual" yang telah ditentukan sebelumnya dan memetakannya ke font nyata yang tersedia di host. Di JDK 1.0, setiap nama font Java dipetakan tepat ke satu font host. Di JDK 1.1, nama font Java dapat dipetakan ke serangkaian font host. Rangkaian font host dapat dipilih untuk mencakup sebanyak mungkin set karakter Unicode yang diinginkan.

Penempatan teks

Karena teks hanyalah jenis gambar lain untuk AWT, sebaris teks dapat ditempatkan di mana saja - bahkan di atas baris teks lainnya. Efek penempatan sembarangan, bagaimanapun, belum tentu enak dipandang. Untuk membantu programmer dalam menghasilkan teks yang menarik secara estetika, definisi font mencakup pedoman untuk penempatan garis dan karakter. Pedoman ini, jika diikuti, akan membantu menghasilkan keluaran yang menyenangkan.

Gambar 4 berisi baris teks yang telah diberi markup untuk menunjukkan karakteristik yang akan kita bahas.

Gambar 4: Baris teks

The y koordinat parameter dalam metode dalam menspesifikasikan bagian sebelumnya lokasi dasar dari baris teks. Garis dasar adalah baris tempat sebagian besar karakter dalam satu baris teks berada (pengecualiannya adalah karakter dengan turunan seperti "g" dan "y"). Garis dasar sebenarnya bukan merupakan karakteristik font tetapi merupakan titik referensi yang dirujuk oleh semua karakteristik lainnya.

The pendakian adalah jarak dari baseline ke atas sebagian besar karakter dalam font. Ini biasanya adalah tinggi huruf kapital di font dan karakter seperti "f" dan "h". Namun, angka ini hanyalah pedoman. Beberapa karakter dalam font sebenarnya mungkin melebihi jarak ini.

The keturunan adalah jarak dari baseline ke bagian bawah karakter dalam font yang memiliki descenders - karakter seperti "p", "g", dan "y". Mengenai pendakian, angka ini hanya sebagai pedoman. Beberapa karakter dalam font sebenarnya mungkin melebihi jarak ini.

The terkemuka (diucapkan "ledding") adalah jumlah ruang antara keturunan dari satu baris teks dan pendakian dari garis di bawahnya. Tinggi baris teks (jarak dari garis dasar satu baris teks ke garis dasar teks di atas atau di bawahnya) menyertakan spasi ekstra ini.

Selain karakteristik yang mengatur font secara keseluruhan, setiap karakter dalam font memiliki muka . Advance menentukan berapa banyak piksel yang memisahkan awal karakter dari awal karakter ke kanan; singkatnya, itu adalah lebar karakter. Sekali lagi, beberapa karakter dalam font sebenarnya dapat melampaui jarak ini.

Dengan menjumlahkan lebar semua karakter dalam satu baris teks, panjang seluruh baris teks dapat dihitung. The FontMetricskelas bawah menyediakan metode yang tidak hanya ini, dan banyak lagi.

Kelas FontMetrics

The FontMetricskelas menyediakan cara sederhana untuk mendapatkan karakteristik yang dibahas di atas. Inilah getFontMetricsmetode yang digunakan:

public void paint (Grafik g) {FontMetrics fm = g.getFontMetrics (); . . . }

Kode di atas menunjukkan bagaimana informasi metrik font yang menggambarkan font saat ini dapat diperoleh. The getFontMetrics()metode mengembalikan sebuah instance dari FontMetricskelas. The FontMetricskelas menyediakan metode berikut:

int getAscent()

  • Mengembalikan pendakian font.

int getDescent()

  • Mengembalikan penurunan font.

int getLeading()

  • Mengembalikan bagian depan font.

int getHeight()

  • Mengembalikan tinggi font. Height adalah jumlah dari font's asccent, descent, dan leading.

int charWidth(int ch)

  • Mengembalikan lebar dari karakter yang ditentukan.

int charWidth(char ch)

  • Mengembalikan lebar dari karakter yang ditentukan.

int [] getWidths()

  • Mengembalikan larik integer yang berisi lebar 256 karakter pertama font.

Seperti disebutkan di atas, karakter yang membentuk font terkadang melampaui pendakian, penurunan, dan lebar yang dilaporkan oleh metode di atas. Dalam kasus di mana nilai pasti diperlukan, metode berikut disediakan.

int getMaxAscent()

  • Mengembalikan pendakian maksimum font.

int getMaxDescent()

  • Mengembalikan penurunan maksimum font.

int getMaxAdvance()

  • Mengembalikan lebar dari karakter terluas di font.

Metode berikut memberikan informasi tentang lebar yang diambil oleh urutan karakter.

int stringWidth(String str)

  • Mengembalikan lebar urutan karakter.

int bytesWidth(byte [] rgb, int offset, int length)

  • Mengembalikan lebar dari urutan panjang panjang byte yang dimulai pada offset .

int charsWidth(char [] rgc, int offset, int length)

  • Mengembalikan lebar panjang urutan panjang karakter dimulai pada diimbangi .

Font Kelas

The Fontkelas merangkum informasi tentang font. Font baru dibuat dengan membuat instance Fontkelas dengan nama, gaya, dan ukuran poin.

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

Setelah dibuat, font dapat ditetapkan ke instance Graphicsobjek.

g.setFont (f); 

The Graphicsobyek kemudian akan menggunakan font untuk semua operasi grafis yang berhubungan teks berikutnya.

The Fontkelas menyediakan metode untuk mendapatkan di informasi tentang font setelah telah dibuat.

String getName()

  • Mengembalikan nama font.

String getFamily()

  • Mengembalikan nama font khusus platform.

int getSize()

  • Mengembalikan ukuran poin font.

int getStyle()

  • Mengembalikan gaya font.

boolean isBold()

  • Mengembalikan truejika font tebal.

boolean isItalic()

  • Menampilkan truejika font miring.

boolean isPlain()

  • Mengembalikan truejika fontnya biasa.

String getName()

  • Mengembalikan nama font.

Demonstrasi

Applet pada Gambar 5 menampilkan sebaris teks dengan markup yang cukup untuk menunjukkan nilai metrik terkait dari bagian di atas. Garis hitam tebal berada di garis dasar. Dua baris tambahan menunjukkan naik dan turunnya fonta yang dimaksud. Garis vertikal yang lebih kecil menunjukkan lebar karakter. Tiga menu tarik-turun memungkinkan Anda memilih font, gayanya, dan ukuran titiknya.

Anda membutuhkan browser yang mendukung Java untuk melihat applet ini. Gambar 5: Browser metrik font interaktif

Applet menggunakan Graphics, Fontdan FontMetricskelas secara luas. Sumbernya tersedia di sini.

Kesimpulan

Tampaknya Graphicskelas tersebut ternyata menjadi lahan yang sangat subur untuk eksplorasi. Dan ekspedisinya belum selesai. Bulan depan saya akan mengakhiri perjalanan saya ke Graphicskelas dengan kolom tentang metode dukungan gambarnya, dan kolom itu akan memulai rangkaian kecil tentang topik lain yang berkaitan dengan gambar dan AWT, termasuk produsen gambar dan konsumen gambar.

Saya ingin berterima kasih kepada Anda semua yang telah meluangkan waktu untuk menulis kepada saya dengan komentar, ide, dan saran Anda. Pertahankan kerja bagus.

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. Todd adalah salah satu penulis SuperBible API Bahasa Java, sekarang ada di toko buku di mana-mana. Selain menulis, Todd menyediakan layanan konsultasi Internet dan Web kepada perusahaan-perusahaan di Amerika Serikat bagian tenggara.

Pelajari lebih lanjut tentang 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 Internasionalisasi:

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

Cerita, "Menggambar teks dengan mudah dengan tiga kelas Java" ini awalnya diterbitkan oleh JavaWorld.