ציור טקסט קל עם שלוש שיעורי Java

בנוסף לשיטות לציור סוגים גיאומטריים פרימיטיביים כמו קווים ועיגולים, Graphicsהכיתה מספקת שיטות לציור טקסט. בשילוב עם הכיתות Fontו- FontMetrics, התוצאה היא מערכת כלים שהופכת את עבודת הציור לטקסט מושך להרבה יותר קל ממה שהיה יכול להיות. טור זה יכסה בתורו את כל אחד מהשיעורים הללו ויראה לכם כיצד להשתמש בהם יחד. אולם לפני שאני מתחיל, סקירה קצרה של תפקיד Graphicsהכיתה מסודרת.

ביקורת

על מנת להשתמש בשיטות הטקסט של Graphicsהכיתה, Graphicsנדרשת הבנה של תפקיד הכיתה עצמה. חלק זה מציג סקירה קצרה על תפקוד Graphicsהכיתה ותפקודה . קוראים המחפשים כיסוי יסודי צריכים לקרוא את הטור שלי באוקטובר, הזמין כאן.

Graphicsהכיתה משחקת שני תפקידים שונים אך קשורים בתוך ערכת כלים חלונאית מופשטים (AWT). ראשית, היא שומרת על ההקשר הגרפי, שמורכב מכל המידע שישפיע על התוצאה של פעולת גרפיקה. זה כולל את צבע השרטוט, את הגופן ואת המיקום והמידות של מלבן הגזירה (האזור בו ניתן לצייר גרפיקה). חשוב מכך, ההקשר הגרפי מגדיר את היעד לפעולות הגרפיקה העומדות לדיון (יעדים כוללים רכיבים ותמונות).

בנוסף להיותה בהקשר הגרפיקה, Graphicsבכיתה מספקת שיטות לציור צורות גיאומטריות פשוט, טקסט ותמונות כדי יעד הגרפיקה. כל הפעולות הקשורות לגרפיקה ברכיב או בתמונה מתרחשות באמצעות אחת מהשיטות הללו.

על מנת לצייר, תוכנית דורשת הקשר גרפי חוקי (המיוצג על ידי מופע של Graphicsהכיתה). מכיוון Graphicsשהמעמד הוא מעמד בסיס מופשט, אי אפשר לייצר אותו באופן מיידי. מופע בדרך כלל נוצר על ידי רכיב, ולאחר מכן הגיש את התוכנית כטיעון לבית של רכיב update()ואת paint()שיטות. שתי שיטות אלה נקראות כחלק ממחזור השרטוט הרגיל שיוזם בתוך ה- AWT.

Graphicsבכיתה עובד יחד עם Fontו FontMetricsכיתות לספק את הכלים הדרושים כדי לצייר טקסט בתוך תמונה או רכיב. נתחיל בבחינת Graphicsשיטות הכיתה לציור טקסט.

גרפיקה כיתתית

Graphicsבכיתה מספק שלוש שיטות לצייר טקסט על רכיב או תמונה.

חלל drawString (מחרוזת str, int x, int y)

drawString()השיטה, המוצגת להלן, לוקחת כפרמטרי מופע של Stringהכיתה המכילה את הטקסט להיגרר, ושני ערכים שלמים המפרטים את הקואורדינטות שבו הטקסט צריך להתחיל.

צבע חלל ציבורי (גרפיקה ז) {g.drawString ("abc", 25, 25); }

הקוד ברישום שלמעלה מציג את drawString()השיטה בשימוש בשיטת רכיב paint(). הקוד בדוגמה זו מצייר את המילה "abc" על הרכיב המכיל paint()שיטה זו . X ו- y קואורדינטות לציין את המיקום של השמאלית התחתונה בפינת תיבת ומצרף להם טקסט. איור 1 מראה כיצד תראה התוצאה אם ​​קוד זה היה חלק מאובייקט רכיב AWT מתאים.

איור 1: הפגנת drawString ()

חלל drawChars (נתונים char [], קיזוז int, int אורך, int x, int y)

drawChars()השיטה הבאה לוקחת כפרמטרי מערך אופי המכיל את הטקסט להיגרר, ערך שלם המציין את לקזז לתוך המערך שבו להתחיל, ערך שלם המציין את מספר התווים לצייר, ושני ערכים שלמים המפרטים את הקואורדינטות שבה הטקסט צריך להתחיל.

צבע חלל ציבורי (גרפיקה ז) {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); }

הקוד שלמעלה מציג את drawChars()השיטה בשימוש בשיטת רכיב paint(). מערך הדמויות משורטט בשני חלקים. בפעם הראשונה משתי הקריאות אל drawChars(), הפרמטר לקיזוז מציין שהציור צריך להתחיל בתו הראשון במערך, ופרמטר האורך מציין שיש לצייר בסך הכל חמש תווים בשורה הראשונה. השנייה מתוך שתי השיחות עובדת באופן דומה אך משרטטת את חמשת התווים האחרונים במערך התווים המתחילים במיקום 25 פיקסלים מתחת לראשון. איור 2 מראה כיצד תראה התוצאה אם ​​קוד זה היה חלק מאובייקט רכיב AWT מתאים.

איור 2: הפגנת drawChars ()

חלל drawBytes (נתונים בתים [], קיזוז int, אורך int, int x, int y)

כפי שמוצג להלן, drawBytes()השיטה לוקחת כפרמטרים מערך בתים המכיל את הטקסט שיש לצייר, ערך שלם המציין את הקיזוז למערך בו מתחילים להתחיל, ערך שלם המציין את מספר הבתים שיש לצייר ושני ערכים שלמים המציינים מתאם היכן הטקסט צריך להתחיל.

צבע חלל ציבורי (גרפיקה 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); }

הקוד שלעיל מציג את drawBytes()השיטה בשימוש בשיטת רכיב paint(). איור 3 מראה כיצד תראה התוצאה אם ​​קוד זה היה חלק מאובייקט רכיב AWT מתאים.

איור 3: הפגנת drawBytes ()

תמיכה ב- Unicode

אחת התכונות המובילות ביותר של Java היא התמיכה שלה בסקריפטים בינלאומיים באמצעות Unicode. זה מצער שספריית המחלקה Java שסופקה עם גרסת 1.0 של שפת התכנות Java לא תמכה באופן מלא בהיבט זה של השפה. עם זאת, נראה כי חדשות טובות ממש מעבר לפינה. לממשק ה- API הבינלאומי הראשוני (ראה משאבים), שניתן להשיג ב- SunSoft, יש לומר:

JDK 1.0 הוגבל להצגת רק את התווים בקבוצת המשנה הלטינית -1 של Unicode. הגבלה זו מוסרת ב- JDK 1.1. תוכניות ג'אווה יוכלו כעת להציג כל תו Unicode שניתן לעבד עם גופן מארח. Java מספקת מספר קטן של שמות גופנים "וירטואליים" שהוגדרו מראש וממפה אותם לגופנים אמיתיים הזמינים במארח. ב- JDK 1.0, כל שם גופן של Java ממופה לגופן מארח אחד בדיוק. ב- JDK 1.1, שם גופן של ג'אווה יכול למפות לסדרה של גופנים מארחים. ניתן לבחור בסדרת הגופנים המארחים לכסות את ערכת התווים של Unicode ככל שתרצה.

מיקום טקסט

מכיוון שטקסט הוא רק סוג אחר של דמות ל- AWT, ניתן להציב שורת טקסט בכל מקום - אפילו על גבי שורת טקסט אחרת. אולם ההשפעה של מיקום סתמי לא תהיה נעימה לעין. על מנת לסייע למתכנת בהפקת טקסט אסתטי, הגדרת גופן כוללת הנחיות למיקום קו ותווים. הנחיות אלה, אם יישמרו עליהן, יסייעו לייצר תפוקה נעימה.

איור 4 מכיל שורת טקסט שסומנה כדי לציין את המאפיינים שעומדים לדון בהם.

איור 4: שורת טקסט

Y לתאם פרמטר בשיטות של מציין בסעיף הקודם את המיקום של הבסיס של שורת טקסט. הבסיס הוא הקו שעליו רוב הדמויות קו של שאר הטקסט (למעט היותו תווים אלה עם היורדים כגון "G" ו- "y"). קו הבסיס אינו באמת מאפיין של גופן אלא הוא נקודת הייחוס אליה מתייחסים כל המאפיינים האחרים.

הטיפוס הוא מרחק מקו הבסיס לחלק העליון של רוב הדמויות בגופן. זה בדרך כלל גובה האותיות הראשיות בגופן ושל תווים כמו "f" ו- "h". נתון זה הוא אך ורק קו מנחה. תווים מסוימים בגופן עשויים להתרחב מעל למרחק זה.

ממוצא הוא מרחק מקו הבסיס לחלק התחתון של התווים בגופן שיש יורדים - דמויות כמו "p", "G", ו- "y". כמו בעלייה, נתון זה הוא רק קו מנחה. תווים מסוימים בגופן עשויים להתרחב מתחת למרחק זה.

המובילים (מבוטא "ledding") הוא המרווח בין הירידה של שורה אחת של טקסט ועד לעלייה של הקו שמתחתיו. גובה שורת הטקסט (המרחק מקו הבסיס של שורת טקסט אחת לשורת הבסיס של שורת טקסט שמעליו או מתחתיו) כולל רווח נוסף זה.

בנוסף למאפיינים השולטים בגופן בכללותו, לכל תו בגופן יש התקדמות . המקדמה מציינת כמה פיקסלים מפרידים בין התחלת התו מתחילת התו מימינו; בקיצור, זה רוחב של דמות. שוב, כמה תווים בגופן עשויים להתרחב מעבר למרחק זה.

על ידי הוספת רוחב כל התווים בשורת טקסט, ניתן לחשב את אורך כל שורת הטקסט. FontMetricsבכיתה מתחת מספק שיטה שעושה בדיוק את זה, ועוד.

כיתת גופן מדדים

FontMetricsבכיתה מספק דרך פשוטה לקבל את המאפיינים שנדונו לעיל. הנה getFontMetricsהשיטה בפעולה:

צבע חלל ציבורי (גרפיקה g) {FontMetrics fm = g.getFontMetrics (); . . . }

הקוד שלמעלה מדגים כיצד ניתן להשיג מידע על מדדי גופן המתארים את הגופן הנוכחי. getFontMetrics()השיטה מחזירה מופע של FontMetricsהכיתה. FontMetricsבכיתה מספקת את השיטות הבאות:

int getAscent()

  • מחזירה את העלייה של הגופן.

int getDescent()

  • מחזירה את ירידת הגופן.

int getLeading()

  • מחזירה את המוביל של הגופן.

int getHeight()

  • מחזיר את גובה הגופן. הגובה הוא סכום העלייה, הירידה והמוליכה של הגופן.

int charWidth(int ch)

  • מחזירה את רוחב התו שצוין.

int charWidth(char ch)

  • מחזירה את רוחב התו שצוין.

int [] getWidths()

  • מחזירה מערך שלם המכיל את רוחב 256 התווים הראשונים של הגופן.

כאמור לעיל, התווים המרכיבים גופן עשויים לעיתים להתרחב מעל העלייה, הירידה והרוחב המדווחים על ידי השיטות לעיל. במקרים בהם נדרשים ערכים מדויקים, השיטות הבאות מסופקות.

int getMaxAscent()

  • מחזירה את העלייה המרבית של הגופן.

int getMaxDescent()

  • מחזירה את הירידה המקסימלית של הגופן.

int getMaxAdvance()

  • מחזירה את רוחב התו הרחב ביותר בגופן.

השיטות הבאות מספקות מידע על הרוחב שנלקח על ידי רצף תווים.

int stringWidth(String str)

  • מחזירה את רוחב רצף התווים.

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

  • מחזירה את רוחב רצף האורך הארוך של בתים המתחילים בקיזוז .

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

  • מחזיר את רוחב אורך הרצף הארוך של דמויות החל לקזז .

גופן כיתתי

Fontבכיתה מתמצתת מידע על גופן. גופן חדש מופק על ידי יצירת מופע של Fontהכיתה עם שם, סגנון וגודל נקודה.

גופן f = גופן חדש ("Dialog", Font.PLAIN, 12); 

לאחר יצירתו, ניתן להקצות גופן למופע של Graphicsהאובייקט.

g.setFont (ו); 

לאחר Graphicsמכן האובייקט ישתמש בגופן עבור כל פעולות הגרפיקה הקשורות לטקסט.

Fontבכיתה מספקת שיטות להשגת תשובות מידע על גופן פעם זה נוצר.

String getName()

  • מחזיר את שם הגופן.

String getFamily()

  • מחזירה את השם הספציפי לפלטפורמה של הגופן.

int getSize()

  • מחזיר את גודל הנקודה של הגופן.

int getStyle()

  • מחזיר את סגנון הגופן.

boolean isBold()

  • חוזר trueאם הגופן מודגש.

boolean isItalic()

  • מחזירה trueאם הגופן נטוי.

boolean isPlain()

  • חוזר trueאם הגופן פשוט.

String getName()

  • מחזיר את שם הגופן.

הדגמה

היישומון באיור 5 מציג שורת טקסט עם סימון מספיק כדי לציין את ערכי המדדים המשויכים מהקטע לעיל. קו שחור עבה יושב בקו הבסיס. שתי שורות נוספות מציינות את העלייה והירידה של הגופן המדובר. קווים אנכיים קטנים יותר מציינים את רוחב התווים. שלושת התפריטים הנפתחים מאפשרים לך לבחור גופן, סגנונו וגודל הנקודה שלו.

אתה זקוק לדפדפן המותאם ל- Java כדי להציג יישומון זה. איור 5: דפדפן מדדי גופן אינטראקטיבי

היישומון משתמשת Graphics, Font, ו FontMetricsכיתות בהרחבה. מקורו זמין כאן.

סיכום

נראה Graphicsשהמעמד התגלה כקרקע פורייה מאוד לחקר. והמסע עדיין לא הסתיים. בחודש הבא אסיים את הטיול שלי Graphicsבכיתה עם טור על שיטות התמיכה שלו בתמונות, והטור הזה יתחיל בסדרה קטנה בנושאים אחרים הקשורים לתמונות ול- AWT, כולל מפיקי תמונות וצרכני תדמית.

אני רוצה להודות לכולכם שלקחו זמן לכתוב לי את ההערות, הרעיונות וההצעות שלך. המשך עם העבודה הטובה.

טוד סונדסטד כותב תוכניות מאז שהמחשבים זמינים במודלים שולחניים. אף על פי שבמקור היה מעוניין לבנות יישומי אובייקטים מבוזרים ב- C ++, עבר טוד לשפת התכנות של ג'אווה כאשר ג'אווה הפכה לבחירה המתבקשת לסוג כזה. טוד הוא מחבר משותף ל- Java Language API SuperBible, עכשיו בחנויות ספרים בכל מקום. בנוסף לכתיבה, טוד מספק שירותי ייעוץ אינטרנט ורשת לחברות בדרום מזרח ארצות הברית.

למידע נוסף על נושא זה

  • ה- GraphicsAPI של Class :

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

  • ה- FontAPI של Class :

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

  • ה- FontMetricsAPI של Class :

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

  • שימוש Graphicsבכיתה:

    //www.javaworld.com/javaworld/jw-11-1996/jw-11-howto.html

  • ממשק ה- API לבינלאומי:

    //www.javasoft.com/products/JDK/1.1/docs/guide/intl/index.html

  • מדריך ג'אווה מאת מרי קמפיונה וקתי וואלאת ':

    //www.javasoft.com/books/Series/Tutorial/index.html

סיפור זה, "ציור טקסט קל עם שלוש שיעורי Java" פורסם במקור על ידי JavaWorld.