Homework 02 - Trying out Event in GUI
การบ้านข้อที่ 1 (ฝึกการใช้ layout แทนการ setBounds)
เคยเล่นเกมโอลิมปิคมั้ย
เป็นเกมที่ผู้เล่นต้องแข่งกันกดปุ่มรัวๆบนแป้นนินเทนโด ยิ่งรัว
ตัวละครยิ่งวิ่งเร็ว คราวนี้ผมเลยเกิดไอเดีย
ให้เราเขียนโปรแกรมวัดการกดรัวกัน (แต่จับเวลาต้องจับเองนะ) ให้มีหน้าตาแบบนี้ตอนเริ่มต้น
- แล้วพอกดรัวที่ปุ่มที่มีคำว่า Click ตัว textField ก็จะนับขึ้นไปเรื่อยๆ เป็น 1 ,2, 3 ... ไปเรื่อยๆ ตามจำนวนครั้งที่กด
- พอกดปุ่ม Reset ตัวเลขใน textfield ก็จะกลับมา 0 อีก
- อย่าลืมว่าพอกดปิดวินโดว์ โปรแกรมก็ต้องปิดการทำงานไปจริงๆนะ
- ให้สัดส่วนการวางปุ่มและ textfield นั้นคงตัว แม้ว่าจะขยายวินโดว์ textfield และปุ่มก็จะขยายตามไปด้วย เช่น
หรือ
แนะวิธีทำ
ให้โครงวินโดว์และปุ่มทั้งหลายขยายตามขนาดวินโดว์ ใช้วิธีนี้ดูนะ
- ใช้เมธอด setLayout(new
เลย์เอาท์แบบที่เราต้องการ()) ของ content
pane ในการเซ็ตว่า จะให้ปุ่มและ สิ่งต่างๆ ลงไปใน content pane อย่างไร
- layout นั้นมีหลายแบบ เปิดเอกสารจาวาในเว็บดูได้ ถ้าทำได้เก่งๆจะสามารถขึ้นรูปวินโดว์ได้เร็วมาก เพราะไม่ต้องมาทดลอง setBounds
- เราสามารถสร้าง
JPanel ขึ้นมา (JPanel มีการใช้งานในการบ้านของแล็บที่ 1 ไง ไปดูโค้ดนะ
แต่ในนั้นยังไม่มีการ setLayout) แล้ว setLayout ของ JPanel
เพื่อเตรียมใส่ปุ่มหรือสิ่งอื่นลงไปใน JPanel
ตามโครงที่เราต้องการได้
- จากนั้นเราก็สามารถเอา JPanel ใส่ container อย่างอื่น เช่น content pane ได้อีกทีหนึ่ง
- ลองจับเวลาในการทำข้อนี้ดู คนที่ทำคล่องแล้ว ไม่ควรเกินสามถึงห้านาทีนะ
การบ้านข้อที่ 2 (จัดการกับ error ใน textfield ของ Inventory Application)
ข้อนี้ทำต่อจากแล็บเลย ถ้าเรารันโปรแกรมในแล็บ จะสังเกตว่า ถ้าเราเกิดใส่อะไรก็ตามที่ไม่ใช่ตัวเลขลงไปในช่อง input เช่น
แล้วไปกด calculate จะปรากฏว่ามี error message เกี่ยวกับ java.lang.NumberFormatException ขึ้นที่
console เต็มไปหมด หรือถ้ากด Calculate ใน executable jar
ก็จะไม่เกิดอะไรขึ้น นี่เป็นเพราะว่า
เราคาดหวังว่าจะได้แต่สตริงที่แปลงเป็นตัวเลขได้ เข้ามาที่ input
ถ้าแปลงไม่ได้ โปรแกรมก็ทำอะไรต่อไปไม่ได้นั่นเอง
งั้นเรามาเปลี่ยนแปลงโปรแกรมหน่อยดีกว่า โดย
- ถ้าเกิดกด Calculate ไปในตอนที่อินพุตเป็นสิ่งที่ไม่สามารถเปลี่ยนเป็นจำนวนเต็มได้
ให้โปรแกรม pop up Warning Dialog ออกมา บอกให้ผู้ใช้โปรแกรมเปลี่ยนค่าใน
textfield ใหม่อีกครั้ง ตามรูปนี้
แนะนำวิธีทำ
ข้อนี้เป็นการจัดการกับโค้ดตรงที่เราคิดว่าอาจเกิดปัญหา error หรือ ....Exception ในขณะที่รันอยู่ (error เพราะว่าแปลงเป็น integer ไม่ได้ )
วิธีการจัดการกับปัญหาประเภทนี้ คือ ตรงโค้ดที่เราสงสัย หรือคาดว่า จะเกิด error ขึ้นนั้น ให้เราเขียนครอบโค้ดส่วนนั้น
ด้วย try block ดังตัวอย่างข้างล่างนี้
try{
// โค้ดส่วนที่ทำให้เกิด error
}catch (Exception e ){
//ถ้าเกิด error ขึ้นจริง โค้ดจะมาทำในนี้ ซึ่งในนี้จะเป็นส่วนที่เราเขียนโค้ดจัดการกับ error หรือเปิด dialog เตือนผู้ใช้
// โปรแกรมได้
}
- Exception e คือ ตัวแปร e ใช้เก็บออบเจ็กต์ Exception โดย
- เมื่อมี
error เกิดขึ้น error จะอยู่ในรูปของ Exception object
และจะถูกพยายามโยนออกไปนอกเมธอด แต่ถ้ามี try-catch จับไว้
เราก็จะเรียก error ตัวนั้นตามที่ catch ตั้งชื่อรอไว้ นั่นคือ e
เราสามารถนำ ข้อมูล ที่มากับ e ไปใช้ต่อได้ ขึ้นอยู่กับโปรแกรม
- ถ้ามี error โค้ดก็จะมาทำในส่วนที่ catch ทำรอไว้ แต่ถ้าไม่มี โค้ดใน catch ก็จะไม่ถูก execute
- รายละเอียดจะได้เรียนอีกทีหนึ่ง ตอนนี้รู้เท่านี้ไว้ก่อน
- สำหรับการสั่งเปิด วินโดว์ ที่เป็น error message ขึ้นมานั้น ขอให้นิสิตไปดูวิธีใช้ JOptionPane ใน java.sun.com
พอทำเสร็จแล้ว ทำเป็น executable jar ทั้งสองไฟล์ไว้ แล้ว zip รวมกันส่งมาที่ progmethcp@gmail.com ภายในเที่ยงคืนวันอาทิตย์หลังจากที่ทำแล็บ 02 โดยในเมล์ subject ต้องเขียนเป็น studentId_hw02_secNumber และชื่อไฟล์จะต้องเป็น studentId_hw02_secNumber.zip ตัวอย่างเช่น 5032117621_hw02_1.zip
studentID คือเลขประจำตัวนิสิต
secNumber คือเบอร์ตอนเรียน