שתי שאלות GUI ב-JAVA

zagzagzag

New member
שתי שאלות GUI ב-JAVA

1. יש לי מחלקה שיורשת מ-JFrame, ולתוכה הוספתי כמה אובייקטים של מחלקה שיורשת מ-JLabel. ההוספה נעשתה ללא מנהל סידור ( (setLayout(null ), ומיקמתי את האובייקטים עם setBounds. במחלקה שיורשת מ-JLabel משתנה ה-icon אחת לכמה שניות (אני לא יכול לדעת כמה) באופן בלתי תלוי במחלקות האחרות (המחלקה זו גם מממשת את Runnable אבל זה לא קשור לשאלה שלי). הבעיה: כשאני מסתיר את החלון התוויות נעלמות, ואני חוזר לראות אותן רק כשה-icon מתחלף. אני לא זוכר שזה היה קורה עם מנהלי סידור שהשתמשתי בהם (FlowLayout, GridLayout וכו'), אז כנראה שזה בגלל שאני לא משתמש במנהל סידור. האם יש דרך לפתור את הבעיה ? אני לא יכול להחליף מנהל סידור, אז זו לא אופציה לפיתרון. 2. במחלקה שיורשת מ-JFrame יש כמה צורות שאני רוצה שיהיו על המסך כל הזמן. מה שעשיתי הוא לדרוס את paint ולצייר את הצורות שם. האם זה נכון לדרוס את paint כדי להשיג את המטרה הזו, או שאולי יש דרך טובה יותר ? תודה מראש
 

zagzagzag

New member
הקפצה

עברתי עמוד
 

Zack DA

New member
גם לגבי 1 וגם לגבי 2,

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

zagzagzag

New member
הסבר

1. יש לי מחלקה שמממשת את Runnable ויורשת מ-JLabel -
class MyLabel extends JLabel implements Runnable​
אחת לכמה שניות (אני לא יודע מראש כמה) מתבצע setIcon במחלקה הזו. בתוך מחלקה אחרת שיורשת מ-JFrame אני מייצר כמה אובייקטים מהמחלקה MyLabel, ומוסיף אותם לחלון. זה נראה בערך כך-
Container container = getContentPane(); container.setLayout(null); // create instances of MyLabel in MyLabelArray // add all instances to the container MyLabelArray[0].setBounds(50,10,IMAGE_SIZE,IMAGE_SIZE); // same goes for all other instances // start the threads​
הקוד הזה עובד. הבעיה מתחילה כשאני מכסה את החלון - כל האובייקטים של MyLabel "נעלמים", ואני רואה אותם שוב רק כאשר הם מבצעים את הקריאה הבאה ל-setIcon. כפי שכתבתי בהודעה הראשונה, אני לא יכול להשתמש במנהל סידור אחר (אולי ב-GridBagLayout אבל אני מעדיף לא להשתמש בו). 2. יש לי מחלקה שיורשת מ-JFrame, ואני רוצה שיהיה ציור שיופיע כל הזמן על המסך (למשל, קו). הכוונה בציור היא לקוד שמשתמש באובייקט Graphics. איפה כדאי לשים את הקוד שמצייר את הקו? אני מקווה שעכשיו ברור מה אני מנסה לעשות
 

Zack DA

New member
אני כנראה לא מבין אותך, כי

בשאלה הראשונה, אם אתה לא רוצה שזה יקפוץ לך כשיש קריאה ל- setIcon, פשוט תתעשה setVIsible שלילי ותבטיח שזה לא יופיע. אם יש לך דברים אחרים על ה- frame שאתה כן רוצה לראות, אז תעשה חלוקה מחדש לכמה פאנלים, ותדאג שהפאנל של ה- icons האלה פשוט לא יוכל להופיע על המסך. ובשאלה השנייה, אני לא מבין מה מונע ממך לשים את הגראפיקה שאתה רוצה באיזהשהו פאנל, שיופיע כל הזמן (יש גם דרך לעשות אותו always on top). ואם לא הבנתי אותך נכון, ואתה מנסה לדרוס את paint, אז לפחות צמצם נזקים ותקרא קודם כל ל- paint של ה- super.
 

CoolerMaster

New member
תגובה

קודם כל כמו שאמר Zack DA, אל תצייר ישר על JFrame אלא על JPanel ואותו תוסיף לפריים. לגבי השאלה הראשונה, עדיף להשתמש במנהל סידור, אבל אם לא השתמשת, זה בכל זאת צריך לעבוד. לגבי השאלה השנייה, אתה יכול לצייר בתוך paint (וחשוב לקרוא באמת ל-paint של ה- super או שאתה יכול לקרוא מתוך ה-paint לפונקציות שיציירו את מה שאתה רוצה בתנאי שתעביר להם את ארגומנט ה- Graphics.
 
למעלה