קשיים שקשורים לגאווה בפרט (עניין של API) וקושי עם Eclipse

קשיים שקשורים לגאווה בפרט (עניין של API) וקושי עם Eclipse

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

1. מתקשה בשימוש של פונקציית ()getResource של מחלקת Class - כשאני נמצא בתוך קוד של מחלקה ורוצה לקבל בעזרת getResource תמונה מסויימת נניח בשם bug.png. במידה והתמונה נמצאת בדיוק באותה תיקייה שבה ה- class הנ"ל נמצא אז פשוט צריך לרשום getClass().getResouece("bug.png")
אבל (ופה הקושי) כאשר התמונה נמצאת במקום שונה לגמרי בפרוייקט, ממה שהצלחתי להבין ברשת, צריך לרשום בארגומנט של הפונקציה משהו כמו (ה- / מציין "רטליביות"):
"/someFolder/anotherFolder/bug.png"
כאשר someFolder נמצאת תחת תיקיית אב של כל הפרויקט שנקראת projectName.
אבל מה שמוזר פה, זה שבפועל הקלאס הנוכחי נמצא בכתובת יחסית שונה לגמרי מהכתובת בארגומנט. נניח הוא נמצא תחת ההירכיה הבאה:
"projectName/src/utilPackage/ourClass"
בכזה מצב כתובת יחסית לא אמורה להיראות ככה? :
"../src/utilPackage/ourClass"
זה נראה שבצורה שזה פועל אין בכלל צורך להשתמש ב: getClass שלא ברור מה התרומה שלו פה, אם הכתובת היא לא יחסית אליו.

2. שאלה ברמה של היררכיה של תוכנית - כשאני עובד בעורך, במקרה שלי אקליפס, אני קצת מתקשה למצוא את ההבדל בין new folder לבין new package כאשר אני לוחץ על הכפתור הימני בעכבר כשאני תחת תיקיית src.
ההבדל היחיד שנראה לעין, הוא כאשר אני עומד על package קיים ואז לחיצה על העכבר ובוחר new folder נוצר לי מעין sub package. לעומת זאת אם אני עומד על package ואז לחיצה על העכבר ובחירת new package אז כברירת מחדל מוצע לי לשים את ה- package תחת תיקיית src ואם אני משנה ורוצה לשים אותה תחת ה- package שעמדתי עליו אני מקבל מעין אזהרה: "source folder is not on the java build class path". אשמח לקבל כל הבהרה שתעשה לי קצת סדר בבלאגן שהתאמצתי לתאר

3. האם כשאני מייצא (ל- archive) את הפרוייקט,בין אם כ- jar או כ- zip, אז כל החבילות מתוארות פשוט כתיקיות במבנה ההירכי של מערכת ההפעלה?

4. קושי די מביך לייבא פרוייקט. כל פעם כשאני מנסה לייבא פרויקט ששמור בתור זיפ אז אני מקבל כל מיני דברים שאני לא רוצה: I. כאשר מנסה לייבא אותו בצורה הבאה: import-> archive file ובחירת קובץ הזיפ אז אני קודם מתבקש לייצר תיקייה. הבעיה שכשאני מייצר תיקייה ומייבא בצורה הזאת, אז נוצרת לי תיקייה בתוך התיקייה שפתחתי. ואני יוצא עם מצב של תיקייה מיותרת.
II. כשאני מייבא את הזיפ כ- File System מקבל גם כפילות לא ברורה (ראו תמונת מצורפת). הזיפ שייבאתי נראה ככה:
תיקיית אב בשם SGI, ומתחתיה התיקיות הבאות:src,lib,images,doc,bin,acctest,fit.jar,.project,classpath
השאלה שלי היא איך אני מייבא את הפרויקט שייראה אחד לאחד כמו זה שייצאתי אותו? ייתכן והבעיה היא בייצוא ואשמח להבין איפה טעיתי ולצרף כל חומר או תמונה שתוכל לעזור להבין אם משהו לא ברור

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

 
הערה: ייתכן והתבלבלתי ו '/' מציין "מוחלט" ולא "יחסי"

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

BravoMan

Active member
כמה תשובות:

די קשה לענות לשאלות שלך בלי להבין מה אתה עושה, אבל הנה כמה הסברים באופן כללי:
&nbsp
1. השימוש ב-"/" בתחילת שם הקובץ מציין נתיב מוחלט.
זה מוסבר במפורש בתיעוד של Java:
Before delegation, an absolute resource name is constructed from the given resource name using this algorithm:
&nbsp
If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
Otherwise, the absolute name is of the following form:
&nbsp
modified_package_name/name
&nbsp
Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e').​
&nbsp
הסיבה שאתה צריך להשתמש ב-getClass היא שפונקציה getResorce אינה סטטית.
אתה צריך אובייקט ולא מחלקה בשביל להפעיל אותה.
&nbsp
2. שפת Java רגישה לשמות ומיקומים של קבצי הקוד שלה.
בניגוד לשפות רבות אחרות, כדי שמחלקה מסוימת תעבוד, היא צריכה לשבת בקובץ עם שם מאוד ספציפי, שיושב שהיררכיית ספריות מאוד ספציפית.
&nbsp
Java משתמש בהיררכיית ספריות כדי לייצג "חבילות" (packages).
&nbsp
האקליפס בנוי לעבוד עם Java, אבל לא רק.
אז לפעמים הוא נותן לך אופציות שבמקרה כמעת זהות: אופציה New Package שהיא ספציפי ל-Java, ואופציה כללית יותר שיכולה לשמש גם שפות אחרות, או יצירה של תשתית לקבצים שאינם Java ונקראת New Folder.
&nbsp
ברמה הטנכית אין באמת הבדל.
אם אני זוכר נכון, האופציה New Package תדאג להמיר נקודות בשם החבילה לתתי תיקיות נפרדות, כך שתוכל ליצור ישר מבנה תיקיות כמו com/test/myapp משם חבילה com.test.myapp.
&nbsp
אבל שוב - זו רק נוחות.
בפועל, "מתחת למכסה" עבור Java חבילה ותיקייה זה אותו הדבר.
&nbsp
3. בלי לדעת איך עשית export אי אפשר להנחות אותך לגב import.
&nbsp
הדרך הכי פשוטה מהכירותי עם eclipse היא פשוט לא להשתמש ב-import ו-export אלא לשים את תיקיית הפרויקט ב-zip ידנית, ואז לפתוח אותה במחשב היעד.
&nbsp
בהצלחה!
 
לצערי לא כל כך הבנתי חלק ניכר מהדברים

קודם כל תודה :) מצטער אם אני לא מספיק מבין עניין
לגבי סעיף 1: מה שהעתקת לי אכן לקוח מהאתר של sun, אבל לא הבנתי את זה לא כשקראתי אז ולא כעת.. אתה אומר ש- getResoruce אינה סטטית ולכן יש לבצע getClass, אבל מה זה בעצם עושה? יכלתי לרשום במקום this.getClass().getResource(), לרשום את: someObject.getClass().getResource() ולקבל בסופו של דבר את אותו ה- url שרציתי? רציתי להבין בדיוק את הכוונה לנתיב מוחלט או נתיב יחסי, כי כפי שהראתי בדוגמא זה לא באמת נתיב יחסי (או שמה שאני חושב נתיב יחסי זה לא באמת נתיב יחסי). נתיב יחסי זה אומר למיטב ידיעתי (אשמח לקבל תיקון), נתיב ביחס לאיפה שיושב הקובץ class שהפעיל את המתודה getResource, בפועל אני לא שם בסוגריים משהו בסגנון של
"../../pictures/png"
בנוסף, אם אני לא משתמש בנתיב יחסי אלא בנתיב מוחלט, למה צריך בכלל לכתוב this.getClass().getResource(). ? למה אי אפשר ישר לתת לבנאי (נניח במקרה שלי לבנאי של imageIcon) את שם הנתיב המלא של הקובץ? הרי זה המשמעות של נתיב מוחלט (תקן אותי בבקשה אם אני טועה)? במקרה כזה אין צורך לקבל את המיקום של ה-class בכלל, כי הכתובת מוחלטת ואינה יחסית למיקום ה- class?

3. פשוט להיכנס ל- workspace וליצור zip? ואז במחשב היעד לפתוח את הזיפ לתוך workspace כלשהו?
אין צורך בהגדרות מסויימות שנשמרות ב- workspace בעת בניית הפרוייט? או שאין כאלה הגדרות?
 

BravoMan

Active member
אנסה להבהיר:

Java היא שפה שמנסה לבודד אותך ממערכת הפעלה.
&nbsp
כשאתה עובד עם פונקציה getResource במקום פונקציות רגילות של פתיחת קבצים, אתה לא מסתכל על מערכת הקבצים של המחשב שלך.
&nbsp
אתה מסתכל על "הפרויקט" שלך, כפי ש-Java מכיר אותו.
"שורש" התחלת מערכת הקבצים הזו, היא היכן שהפרויקט כולו הותקן.
אם הפרויקט שמור בתוך קובץ JAR, הרי שמערכת הקבצים שלך היא בכלל תוכן של אותו קובץ JAR.
&nbsp
כאשר אתה נותן ל-getResource פרמטר שמתחיל ב-/ היא חושבת שזה נתיב מלא לקובץ מאותו "שורש" מערכת קבצים, ולא מתחשבת בכלל במיקום ה-Class ממנו קראת לפונקציה.
&nbsp
אם אתה לא מתחיל את שם הקובץ ב-/ היא מתחשבת במיקום ה-class ומוסיפה אותו לשם ששלחת.
&nbsp
אאל"ט בניגוד לפונקציות קבצים רגילות, getResource לא יודעת להתמודד עם קיצורי דרך כגון "..\.."
&nbsp
לגבי אופן הקריאה ל-getResource:
זו פונקציה לא סטטית של מחלקה Class.
&nbsp
אם כבר יש לך אובייקט מטיפוס Class, אתה יכול לקרוא לה ישירות.
&nbsp
אם יש לך אובייקט מטיפוס אחר כלשהו, אתה צריך להוציא אובייקט מטיפוס Class שמתאר אותו ע"י קריאה לפונקציה getClass על האובייקט הזה, ואז תוכל להפעיל את getResource.
&nbsp
מה זה עושה?
התפקיד של אובייקטים מטיפוס Class הוא להחזיק ולספק לך מידע על מחלקות שונות ב-Java, כולל אלה שיצרת בעצמך.
כתבת בקוד:
public class MyApp {
}
&nbsp
MyApp app = new MyApp();
app.getClass();​
&nbsp
מה שתקבל חזרה בשורה התחתונה זה אובייקט מטיפוס Class שמחזיק מידע על המחלקה MyApp שלך.
&nbsp
חלק מהמידע ש-Class מחזיק הוא שם המחלקה, ואיפה בתוך הפרויקט היא חיה.
כלומר, מאיפה בדיוק ה-VM של Java טען אותה, כשכתבת new.
&nbsp
וזה בדיוק המידע ש-getResource צריכה כדי להגיע לקובץ שאתה מבקש ממנה.
זו הסיבה שהיא בנויה איך שהיא בנויה, ואתה צריך לקרוא לה בצורה שאתה צריך לקרוא לה.
&nbsp
אתה לא יכול לכתוב this.getResource על המחלקה שלך, כי אין למחלקה שלך פונקציה כזו.
ואתה לא יכול לקרוא ל-Class.getResource כי המחלקה Class עצמה לא יודעת איפה הקבצים בפרויקט שלך חיים.
עד ש-VM של Java לא טוען משהו, המידע הזה לא קיים.
&nbsp
&nbsp
מקווה שעכשיו זה מובן.
אחרת, יכול להיות שאני לא מבין מה בדיוק אתה שואל...
&nbsp
לגבי ייצוא \ ייבוא, הפרוצדורה שתיארת היא מה שהתכוונתי.
מזמן לא עבדתי עם אקליפס, אז אני לא זוכר אם הוא מזהה אוטומטית מה יש ב-Workspace או שצריך עוד משהו. אולי open.
&nbsp
מציע שתנסה פשוט להעתיק.
&nbsp
בהצלחה!
 
תודה רבה על התשובה המושקעת. מתנצל שהגבתי רק היום

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