เมื่อทำงานที่เกี่ยวกับไฟล์ ไม่ว่าจะเป็นไฟล์รูป เท็กซ์ไฟล์ หรือไฟล์แบบอื่นๆ สิ่งที่สำคัญที่จะขาดไม่ได้เลยนั้น คือ Path ที่อยู่ของไฟล์ สำหรับนักพัฒนาโปรแกรมมือใหม่อาจจะยังไม่ใส่ใจเรื่องนี้ หรือคิดเพียงว่าเครื่องเราแสดงผล OK เป็นใช้ได้ แต่ปัญหาจะมาเกิดตอนไปรันที่เครื่องอื่นๆ เช่น
กรณีตัวอย่าง
- โปรแกรมตัวอย่างนี้เป็นเกม Hang man ที่พัฒนาด้วยภาษา Java ซึ่งมีการกำหนด Path ของภาษา Background ตาม Code ต่อไปนี้
bgMainMenu = new JLabel(); bgMainMenu.setHorizontalAlignment(SwingConstants.CENTER); bgMainMenu.setHorizontalTextPosition(SwingConstants.CENTER); //Path bgMainMenu.setIcon(new ImageIcon("E:/java/projectPic/BGmain.jpg"")); //Path bgMainMenu.setBounds(new Rectangle(0, 0, 793, 571)); bgMainMenu.setText("");
- เมื่อนำรันที่เครื่องของน้อง กุ๊ก ปรากฏว่าสามารถแสดงผลได้สวยงาม ดังรูป
- น้อง กุ๊ก ส่งให้นายแว่นตรวจสอบปรากฏว่าภาษาพื้นหลังไม่ขึ้น ซวยและทีนี้ (นายแว่นวางไฟล์ไว้ในไดร์ฟ D)
ปัญหา
- เพราะโปรแกรมมีการกำหนดแบบ absolute path (กำหนดที่อยู่ไฟล์แบบละเอียด บอกว่าอยู่ไดร์ฟไหน อะไรอย่างไร)
แนวทางแก้ไข
- เราปรับเปลี่ยน path ของรูปภาพ จากเดิมที่เป็น absolute path มาเป็นแบบ relative path (กำหนดทีอยู่ไฟล์แบบคร่าว คือ ส่วนแรกให้คอมมันหาให้ + ส่วนที่สอง คือ แสดง Path ไปหาไฟล์)
- absolute path "E:/java/projectPic/BGmain.jpg"
- relative path dirPath+"/projectPic/BGmain.jpg" ซึ่งเราจะต้องมาหาว่า dirPath ต้องเอาอะไรมาใส่ดี
- มารู้จักกับ System.getProperty("user.dir"); คือ อะไร
- getProperty(): เป็นคำสั่งที่ช่วยค่า property ต่างๆของระบบปฏิบัติการออกมา
- "user.dir": เป็น Parameterที่ช่วยบอกให้โปรแกรมมันไปดึง Path ที่อยู่ของโปรแกรม หรือไฟล์ Java ที่รันอยู่ ว่าอยู่ในโฟลเดอร์ไหน ไดร์ฟอะไร
- ทดสอบแก้ไขโดยการใช้ System.getProperty("user.dir"); เพื่อเอาข้อมูล path ทีหายไปมาใส่ใน dirPath ตาม code ต่อไปนี้
bgMainMenu = new JLabel(); bgMainMenu.setHorizontalAlignment(SwingConstants.CENTER); bgMainMenu.setHorizontalTextPosition(SwingConstants.CENTER); //Path final String dirPath = System.getProperty("user.dir"); bgMainMenu.setIcon(new ImageIcon(dirPath+"/projectPic/BGmain.jpg"")); //Path bgMainMenu.setBounds(new Rectangle(0, 0, 793, 571)); bgMainMenu.setText("");
ผลการทดสอบ
- โปรแกรมนี้สามารถแสดงผลได้อย่างสวยงาม และสามารถรันได้ทุกเครื่องแม้วามีสภาพแวดล้อมที่ต่างกัน
สรุป
- จากตัวอย่างนี้จะแสดงการใช้คำสั่ง System.getProperty("user.dir"); เพื่อมาหา Path จริงของไฟล์โปรแกรมเรา เพื่อนำ Path ที่ได้ ไปอ้างอิงต่ออีกที่เพื่อให้ได้ไฟล์รูป Background แต่ยังมีอีกหลายวิธีที่สามารถทำได้ ถ้าเราเริ่มวางโครงโปรเจคใหม่ๆเลย อาจจะแยกโพลเดอร์ที่เกิดกับรูปภาพ ในโปรแกรม หรือไฟล์ที่จำเป็น ออกมาเป็น ClassPath Resource ก็ได้นะ
ปล. ต้องขอขอบตุณน้อง Kook kik จาก มศว ที่ช่วยนำปัญหามาปรึกษา และพี่ได้เชียนลง Blog
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.