קטעי קוד מעניינים
נתחיל בקטע המראה את המחלקה השולטת המכיל את המתודה ההכרחית main() . המתודה main() יוצרת מופע של
אובייקט מסוג GUI שבו נעשית כל העבודה.
import java.awt.*; import java.awt.event.*; class Event18{ public static void main(String[] args){ GUI gui = new GUI(); }//end main }//end class Event18 |
הקטע הבא מראה את התחלת המחלקה GUI ביחד עם משתנים שמשתמשים בהם מאוחר יותר בתכנית.
class GUI{ Scrollbar myScrollbar; TextField displayWindow; int bubbleWidth;//needs to be accessible by event handler |
הקטע הבא מתחיל בפונקציה בונה (constructor) עבור המחלקה GUI . היא מתחילה על ידי יצירת מופע של אובייקט
Frame שישמש חלון על לאפליקציה.
לאחר מכן יש יצירת מופע של אובייקט scrollbar אופקי , עם טווח 0 עד 100, מיקום התחלתי ב-50 ,רוחב בועה של 20 ,
ערךUnit Increment 2 וערךBlock Increment 15 .
מרכיב ה-Scrollbar לא ממרכז את הבועה לפי הערך שניתן, אלא הקצה השמאלי של הבועה מיושר לפי הערך.
התוצאה היא שערכים בקצה העליון של הטווח לא ניתנים להשגה אלא אם נעשים התאמות מסוימות תוך שימוש בחצי רוחב
בועה. זה מפצל את הערכים שאינם ניתנים להשגה בשני קצות ה-Scrollbar ואז אפשר להרחיב את ערכי המינימום
והמקסימום מעבר לערכים הרצויים בחצי רוחב בועה.
GUI(){ Frame myFrame = new Frame("Copyright 1997, R.G.Baldwin"); bubbleWidth = 20; int initialPosition = 50 - bubbleWidth/2; int min = 0 - bubbleWidth/2; int max = 100 + bubbleWidth/2; myScrollbar = new Scrollbar(Scrollbar.HORIZONTAL, initialPosition, bubbleWidth, min, max); |
הקטע
הבא קובע את ערךUnit Increment ל-2 וערךBlock Increment ל-15 .
Unit Increment הוא ערך השינוי הנגרם על ידי לחיצה באחד הקצוות של ה-Scrollbar . Block Increment הוא ערך
השינוי הנגרם על ידי לחיצה ברווח בין הבועה לאחד הקצוות של ה-Scrollbar .
myScrollbar.setBlockIncrement(15); myScrollbar.setUnitIncrement(2); |
קוד כמו שמופיע להלן צריך להיות מוכר לך בשלב זה, הוא לא מעניין במיוחד ומופיע רק בשביל השלמות.
קוד זה יוצר את חלון התצוגה על ידי שימוש באובייקט Textfield. הוא גם מוסיף שני מרכיבים ל-Frame , קובע את גודל
ה-Frame ומציג את כל זה.
הקטע גם מכיל קוד טיפוסי ליצירת אובייקט listener בשביל ה- Scrollbar וגורם שיקבל הודעות על אירועי adjustment .
לאחר מכן מופיע קוד טיפוסי לרישום (register) חלון listener כדי להפסיק את התכנית כאשר המשתמש לוחץ על תיבת
Close ב-Frame .
בזה מסתיים ה-constructor והגדרת המחלקה GUI .
displayWindow = new TextField("Initial Text"); displayWindow.setEditable(false);//make non-editable //add components to the GUI myFrame.add("South", myScrollbar); myFrame.add("North", displayWindow); myFrame.setSize(300,75); myFrame.setVisible(true); MyScrollbarListener myScrollbarListener = new MyScrollbarListener(this); //Note that the Scrollbar listener is not added as a // ScrollbarListener but rather is added as an // AdjustmentListener. myScrollbar.addAdjustmentListener(myScrollbarListener); //Close Frame to terminate. myFrame.addWindowListener(new MyWindowListener()); }//end constructor }//end class GUI |
קטע הקוד הבא מתחיל להיות שוב מעניין, הוא מראה את ההתחלה של המחלקה AdjustmentListener שממנה נוצר
אובייקט listner ונרשם ב-Scrollbar להאזין לאירועי adjustment . קטע זה מראה את ה-constructor של המחלקה
ששומר התייחסות (refrence) ל-Scrollbar .
class MyScrollbarListener implements AdjustmentListener{ GUI thisObject; //save ref to GUI object here MyScrollbarListener(GUI objectIn){//constructor thisObject = objectIn; }//end constructor |
הקטע הבא מתחיל את הקוד שמכיל את לב התכנית , זוהי המתודה adjustmentValueChanged() ,שהיא המתודה היחידה המוצהרת במנשק AdjustmentListener. מתודה זו מקבלת כפרמטר אובייקט מסוג AdjustmentEvent .
קטע זה משתמש באובייקט הנכנס כדי לקבל את האובייקט ולהציג אותו, מקור האירוע וסוג האירוע.
public void adjustmentValueChanged(AdjustmentEvent e){ int value; //Display the entire AdjustmentEvent object System.out.println(e); System.out.println("Adjustable = " + e.getAdjustable()); System.out.println("AdjustmentType = " + e.getAdjustmentType()); |
קטע פלט
זה נוצר על ידי הקטע לעיל כאשר נלחץ הכפתור בקצה הימני של ה-Scrollbar . (הוכנסה חלוקה לשורות
על ידי המחבר).
java.awt.event.AdjustmentEvent[ADJUSTMENT_VALUE_CHANGED, adjType=UNIT_INCREMENT,value=42] on scrollbar0 Adjustable = java.awt.Scrollbar[scrollbar0,4,56,292x15, val=42,vis=20,min=-10,max=110,horz] AdjustmentType = 1 |
הקטע הבא משתמש באובייקט הנכנס כדי לקבל את הערך של ה-scrollbar ולהציג אותו באובייקט TextField .
הערך צריך לייצג את מיקום הבועה (למעשה הוא מייצג את מיקום הקצה השמאלי של הבועה ולא את המרכז).
קטע זה מכיל קוד לשימוש כ-"מעקף" לבאג ב- JDK 1.1.6 שבו ערכים שליליים קטנים מדווחים כערכים חיוביים גדולים,
כאשר ה-scrollbar "מותאם" על ידי גרירת הבועה. שימו לב שהבאג עדיין קיים ב-JDK 1.1.6 אך תוקן ב- .JDK 1.2
הקטע גם מכיל קוד להתאמת הערך המדווח למרכז הבועה במקום לקצה השמאלי שלה, על יד הגדלת הערך בחצי רוחב
הבועה.הערך המותאם מוצג באובייקט ה-TextField.
הוא גם מכיל קוד לפתור באג אחר שגורם לבועה לקפוץ חזרה לערכה הקודם כאשר מנסים לגרור אותה ב- JDK 1.1.6 .
זה גם תוקן ב- .JDK 1.2
value = e.getValue();//get and save the value //The following code is here to work around a // bug in the Scrollbar object for JDK 1.1.6 if(value > 65000) value = value - 65536; //Adjust value to center of the bubble thisObject.displayWindow.setText("Value = " + (value + thisObject.bubbleWidth/2)); //The following is required to make the bubble stay put // in JDK 1.1.6 (not required for JDK 1.2) thisObject.myScrollbar.setValue(value); }//end adjustmentValueChanged() }//end class MyScrollbarListener |
זה מסכם את קטעי הקוד המעניינים לתוכנית זו, פירוט שלם של התכנית מופיע בקטע הבא.