עבור לתוכן

ג'אווה| שימוש ב mouseAdapter

Featured Replies

פורסם

היי,

בקוד שאני כותב אני יורד מהמחלקה mouseAdapter ומשתמש בפעולה mousePressed.

האם אני יכול במקום מסויים בקוד שלי לעשות עצירה עד הרגע שבו המשתמש ילחץ על כפתור בעכבר?

חשבתי על לשמור את הערך האחרון של הנקודה בה העכבר נלחץ לאחרונה ולהכניס ללולאה תנאי שעד שלא תילחץ נקודנ שונה תיעשה בדיקה.

א. זה לא יעיל בעליל, בזמן שהאדם "חושב" איפה ללחוץ מתבצעות פעולות בלי הפסקה (ממש כמו בלולאה אין סופית).

ב. זה יוצר הרבה מאוד בעיות ואי אפשר לעקוב על התוכנית בצורה נורמלית.

רב תודות :yelclap:

פורסם

מה זאת אומרת עצירה?

בכל מקרה, מדובר ב-listener. את הקוד שאתה רוצה שיתבצע אחרי הקליק תשים בתור ה-event עצמו.

פורסם
  • מחבר

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

פורסם

אתה מבצע קריאת קלט מהמשתמש. כמו כל פעולת IO מתבצע context switch עד שמתקבל interrupt מהחומרה.

דבר כזה לא מבזבז משאבים (כלומר, busy wait לא קורה).

פורסם
  • מחבר

השאלה היא איך לבצע את זה?

אמרת כל מיני מושגים שאין לי מושג מה הם אומרים.

פורסם

בשביל זה משתמשים ב-wait ו-notify. לכל אובייקט יש זוג מתודות - wait ו-notify. המתודה wait משהה את המשך הריצה של הקוד (ליתר דיוק, היא משהה את ה-Thread הנוכחי) עד שמישהו קורא ל-notify או notifyAll (לא משנה כרגע מה ההבדל ביניהן).

בצורה הבסיסית ביותר, זה צריך לעבוד ככה:

class SomeClass {
private boolean wasClicked = false;
private Object syncObj = new Object();

public void waitForClick(){
synchronized(syncObj) {
while(!wasClicked {
syncObj.wait();
}
}
}

public void doClick(){
synchronized(syncObj){
wasClicked = true;
syncObj.notifyAll();
}
}
}

wasClicked הוא משתנה ששומר האם הייתה לחיצה. syncObj זה האובייקט שבו נשתמש כדי להשהות את התכנית, באמצעות wait/notify.

הפונקציה wait היא מאוד פשוטה - היא

איפה שאתה רוצה להשהות את הקוד אתה קורא ל-waitForClick. הפונקציה הזו מאוד פשוטה - כל עוד לא הייתה לחיצה, היא אומרת ל-syncObj לחכות.

ה-mouseAdapter אתה צריך לקרוא ל-doClick. הפונקציה הזו עושה שני דברים: מסמנת שהייתה לחיצה, ומודיע ל-syncObj להתעורר מההשהיה.

הבעיה היחידה כאן היא שאם הקוד שמפעיל את waitForClick נקרא מתוך ה-GUI (כלומר, לדוגמה, הוא נקרא כשאתה לוחץ על כפתור אחר או משהו כזה) אז זה יתקע את התכנית, כי כל ה-GUI רץ ב-Thread אחד, ובעצם השהית אותו (ואז הוא גם לא יגיע לטפל בכלל בלחיצת העכבר). הפתרון לזה הוא בעת ביצוע הפעולה הזו לפתוח Thread חדש ובתוכו לקרוא לקוד שמחכה ללחיצת העכבר. אם אין לך מושג מה זה אומר, אז מומלץ שתלמד קצת על Threads בג'אווה...

פורסם
  • מחבר

זה אפשרי שרק הקוד שמחקה ללחיצת עכבר יהיה בthread

והתוכנית תמשיך לרוץ כרגיל בלי שימוש ב thread?

פורסם

כמובן - איפה שאתה רוצה לחכות ללחיצה, צור ת'רד חדש ודאג שהוא יהיה זה שיחכה ללחיצה (ויבצע מה שצריך לבצע אחרי הלחיצה, כמובן).

נ.ב. אין כזה דבר "בלי שימוש ב-thread", כל התכנית תמיד רצה לפחות בת'רד אחד (במקרה של GUI בד"כ יש לפחות שניים - אחד שבו רצה ה-main ואחד שבו רץ ה-GUI).

פורסם
  • מחבר

יש לי שאלה נוספת, בקוד שרשמת השתמשת במשתנה בוליאני wasClicked ,

על פי מה המשתנה אמור להשתנות?

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים