פורסם 2013 בינואר 1212 שנים היי, בקוד שאני כותב אני יורד מהמחלקה mouseAdapter ומשתמש בפעולה mousePressed. האם אני יכול במקום מסויים בקוד שלי לעשות עצירה עד הרגע שבו המשתמש ילחץ על כפתור בעכבר? חשבתי על לשמור את הערך האחרון של הנקודה בה העכבר נלחץ לאחרונה ולהכניס ללולאה תנאי שעד שלא תילחץ נקודנ שונה תיעשה בדיקה. א. זה לא יעיל בעליל, בזמן שהאדם "חושב" איפה ללחוץ מתבצעות פעולות בלי הפסקה (ממש כמו בלולאה אין סופית). ב. זה יוצר הרבה מאוד בעיות ואי אפשר לעקוב על התוכנית בצורה נורמלית. רב תודות
פורסם 2013 בינואר 1212 שנים מה זאת אומרת עצירה?בכל מקרה, מדובר ב-listener. את הקוד שאתה רוצה שיתבצע אחרי הקליק תשים בתור ה-event עצמו.
פורסם 2013 בינואר 1212 שנים מחבר אני רוצה שיהיה מצב כמו כשמשתמשים במקודה nextInt, עד שהמשתמש לי יזין ספרה התוכנית לא תמשיך.
פורסם 2013 בינואר 1212 שנים אתה מבצע קריאת קלט מהמשתמש. כמו כל פעולת IO מתבצע context switch עד שמתקבל interrupt מהחומרה.דבר כזה לא מבזבז משאבים (כלומר, busy wait לא קורה).
פורסם 2013 בינואר 1312 שנים מחבר השאלה היא איך לבצע את זה?אמרת כל מיני מושגים שאין לי מושג מה הם אומרים.
פורסם 2013 בינואר 1312 שנים בשביל זה משתמשים ב-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 בג'אווה...
פורסם 2013 בינואר 1312 שנים מחבר זה אפשרי שרק הקוד שמחקה ללחיצת עכבר יהיה בthreadוהתוכנית תמשיך לרוץ כרגיל בלי שימוש ב thread?
פורסם 2013 בינואר 1312 שנים כמובן - איפה שאתה רוצה לחכות ללחיצה, צור ת'רד חדש ודאג שהוא יהיה זה שיחכה ללחיצה (ויבצע מה שצריך לבצע אחרי הלחיצה, כמובן).נ.ב. אין כזה דבר "בלי שימוש ב-thread", כל התכנית תמיד רצה לפחות בת'רד אחד (במקרה של GUI בד"כ יש לפחות שניים - אחד שבו רצה ה-main ואחד שבו רץ ה-GUI).
פורסם 2013 בינואר 1412 שנים מחבר יש לי שאלה נוספת, בקוד שרשמת השתמשת במשתנה בוליאני wasClicked ,על פי מה המשתנה אמור להשתנות?
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.