JPanel

ehudl1

New member
JPanel

שלום,

רציתי לדעת כיצד נכון להוסיף מערך כפתורים לתוך JPanel?

panel.add(buttons);


כשניסיתי קיבלתי שגיאה כזו:

private ArrayList arr= new ArrayList();
private Component buttons= new JButton [SIZE+1][SIZE];
private Tool tool= new Tool();
...

כאילו שאני צריך לשנות מ- JButton ל- Component.

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

תודה.
 

BravoMan

Active member
יש רק דרך אחת - לולאה:

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

אגב, היות ו-JButton יורש מ-Component אתה לא חייב לעשות לו Casting או לשמור מערך של Component.

אתה יכול להעביר ל-add אובייקט מסוג JButton ישירות, וזה יקל עליך לעבוד איתם בהמשך.
 

BravoMan

Active member
אי אפשר להוסיף מערך כפתורים לפנל. אין פונקציה

שעושה את זה.

אם יש לך מערך כפתורים, אתה צריך להוסיף אותם אחד אחד בלולאה.

for (int i = 0; i < buttons.length; i++
panel.add(buttons);
 

BravoMan

Active member
אל תתעסק עם Component, אתה לא צריך אותו

חוץ מזה, אם הקוד שהעתקת לכאן הוא בדיוק מה שאתה מנסה לקמפל, הרי שהשורה:

private Component buttons= new JButton [SIZE+1][SIZE];


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

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

אל תכתוב "משהו על Component", אלא תעתיק את הודעת השגיאה המלאה בדיוק כפי מופיע לך על המחשב.

עזור לנו לעזור לך!
 

ehudl1

New member
זאת השורה שהוא רוצה כאשר אני רושם את מה שאתה

רשמת לי למעלה. כלומר את הלולאה.
 

ehudl1

New member
עזרה במציאת קוד כתוב

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

אנסה להסביר מה יש לי ואולי תוכלו להנחות אותי מה לא בסדר.
מתודות:
searchTool- בודקת איזה כלי אני ויוצרת מערך של נקודות חוקיות במרחב עבור אותו כלי.
winTheGame- בודקת אם יש שח או שח-מט
switch- מחליפה אבל על פי נקודה שלחצתי (על הכפתור בפעם השנייה... כאן אין בפועל לחיצה שנייה)- את זה אפשר לממש ידנית מקסימום במקרה הזה.

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

אשמח לעזרה.
 

ehudl1

New member
הנה דוגמא פשוטה

public void computerPlay()
{
ArrayList newArr = new ArrayList();
for (int p=0; p < SIZE; p++)
for (int q=0; q < SIZE; q++)
if (board.blackOrWhite(p, q)!=board.blackOrWhite(x, y) && board.blackOrWhite(p, q)!='n')
{
searchTool(p,q);
if (arr.size()>0)
{
winTheGame(arr);
if (flagWin==1)
break;
}
}
if (flagWin==0)
{
for (int p=0; p < SIZE; p++)
for (int q=0; q < SIZE; q++)
if (board.blackOrWhite(p, q)!=board.blackOrWhite(x, y))
{
searchTool(p,q);
if (arr.size()>0)
{
InfoPlace info= (InfoPlace) arr.get(0);
buttons[info.getX()][info.getY()].setIcon(buttons[p][q].getIcon());
flag=0;
whoPlays='w';
break;
}
}
}
} // computerPlay

אבל אני מקבל את השגיאה הזו:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

על השורה הזו:

searchTool(p,q);

המתודה מקבלת 2 ערכים בסך הכל ובודקת לפי המיקום שלהם את הנקודות החוקיות לתזוזה "במרחב".

תודה.
 

BravoMan

Active member
זו לא דוגמה פשוטה!

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

בנוסף, אם אכן השגיאה מראה על שורה של searchTool, הרי שאנחנו לא יודעים מה searchTool עושה.
אנחנו גם לא יודעים מה הם ערכי ה-p, q כאשר אתה מקבל את השגיאה.

אנחנו אפילו לא יודעים מה הוא SIZE...

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

כל הכלים בידיך...
 

BravoMan

Active member
נמנעתי מלענות קודם, כי מה שאני הולך להגיד

לא ישמע נחמד כ"כ, אבל נראה שמישהו חייב לומר את זה:

אף אחד כאן לא יכול לעזור לך!

יש לזה שתי סיבות עיקריות:

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

בנוסף, אתה תמיד מתאר את הבעיה שלך בצורה כללית מידי "לא מסתדר לי", "לא מזהה", "הוא צועק עלי".

זה חסר משמעות עבורנו, כי רק אתה יודע מה זה "מזהה" ומה זה "מסתדר".
אני עדיין לא מבין מה היא הודעת השגיאה שקיבלת בקשר ל-Component!

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

ואם אתה מקבל הודעת שגיאה, תביא את הטקסט שלה במדויק, ואת שורת הקוד שרשומה בהודעה!

רק ככה אפשר יהיה לעזור לך.

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

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

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

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

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

בכל מקרה,
בהצלחה!
 
למעלה