หลังจากสามารถสร้าง GUI ให้ได้หน้าต่างแบบที่ต้องการเป็นที่เรียบร้อยก็จะพบว่าเมื่อรันโปรแกรมจะปรากฏหน้าจอ GUI ขึ้นมาก็จริงแต่ไม่สามารถตอบสนองได้ เช่น กดปุ่มก็ไม่เกิดอะไรขึ้น นั่นก็เป็นเพราะว่ายังไม่ได้มีการกำหนดหน้าที่ของคอมโพเนนท์ต่างๆใน GUI ซึ่งการจะกำหนดการกระทำต่างๆให้ GUI เรียกว่าการจัดการกับอีเวนท์ หรือ Event Handling
การจัดการกับอีเวนท์
Event แปลว่าเหตุการณ์ ซึ่งหมายถึงเหตุการณ์ต่างๆที่เกิดขึ้นกับโปรแกรม เช่น เกิดเหตุการณ์คลิ๊กโดยเมาส์ การกดปุ่มที่แป้นพิมพ์ (เช่นปุ่ม Enter) แต่การสร้าง GUI เฉยๆไม่ได้กำหนดการรับมือกับเหตุการณ์ต่างๆหากอยากให้โปรแกรมใช้งานได้ก็ต้องรับมือกับอีเวนท์ด้วย ซึ่งก่อนอื่นควรทำความรู้จักกับอีวเนท์ประเภทต่างๆก่อน ซึ่งจะแนะนำจาก ประเภทอีเวนท์ว่าอีเวนท์นั้นๆใช้ทำอะไร โดยจะ new anonymous inner class ของอินเตอร์เฟซใดและใช้เมท็อดอะไร
1.ActionEvent
การใช้งาน : อีเวนท์นี้มีไว้สำหรับจัดการกับการคลิ๊ก JButton และ การใช้ปุ่ม Enter การดับเบิลคลิ๊กและการเลือกใน MenuItem
อินเตอร์เฟซ : ActionListener
เมท็อด : actionPerformed(ActionEvent)
2.ComponentEvent
การใช้งาน : เป็นตัวบอกให้รู้ว่าใช้คอมโพเนนท์อะไรบ้าง
อินเตอร์เฟซ : ComponentListener
เมท็อด : componentMoved(ComponenEvent), componentHidden(ComponenEvent), componentShow(ComponenEvent)
3.ContainerEven
การใช้งาน :สำหรับการเพิ่มและลบคอนเทนเนอร์
อินเตอร์เฟซ : ContainerListener
เมท็อด : componentAdded(ContainerEvent), componentRemoved(ContainerEvent),
4.FocusEvent
การใช้งาน : เมื่อผู้ใช้เลื่อนอุปกรณ์อินพุตมาชี้ยังอ็อปเจ็คของส่วนประกอบกราฟฟิกใดๆ
อินเตอร์เฟซ : FocusListener
เมท็อด : focusGained(FocusEvent), focusLost(FocusEvent)
5.ItemEvent
การใช้งาน : เมื่อทำการเลือกรายการใน List หรือ Checkbox
อินเตอร์เฟซ : ItemListener
เมท็อด : itemStateChaned(ItemEvent)
6.KeyEvent
การใช้งาน : เมื่อการทำงานเกี่ยวข้องแป้นพิมพ์
อินเตอร์เฟซ : KeyListener
เมท็อด : keyPressed(KeyEvent), keyReleased(KeyEvent), keyTyped(KeyEvent),
7.MouseEvent
การใช้งาน : เมื่อต้องการใช้งาน คลิ๊ก(clicked) เคลื่อนที่(moved) ลากวาง(dragged) โดยใช้ได้กับ JButton JCheckboc, JScrollPane, JTextField เป็นต้น
อินเตอร์เฟซ : MouseListener
เมท็อด : mousePressed(MouseEvent) กดค้างไว้, mouseReleased(MouseEvent) ปล่อยเมาส์, mouseClicked(MouseEvent) คลิ๊กเมาส์
8.MouseMotionEvent
การใช้งาน : คล้ายกับ 7
อินเตอร์เฟซ : MouseMotionListener
เมท็อด : mouseDragged(MouseEvent), mouseMoved(MouseEvent),
การใช้งาน
ขั้นแรกต้องรู้ก่อนว่าต้องการให้คอมโพเนนท์ใดทำงาน เช่น ง่ายๆและใช้บ่อยๆเลยก็คือปุ่ม(JButton) ก็ต้องนึกต่อไปอีกว่าจะให้ปุ่มทำงานอะไรได้ ก็เช่นคลิ๊กได้หรือกด Enter ก็ได้ด้วย
ขั้นต่อมาก็ให้มาดูที่อีเวนต์ว่าว่ามีอีเวนต์ตัวไหนที่สามารถทำให้ปุ่มทำงานตามที่ต้องการได้บ้าง ให้เลือกให้เข้าคู่ถูกต้องกับการทำงาน
ขั้นตอนการเรียกใช้อีเวนต์เป็นดังนี้
- สร้างตัวแปรอ็อปเจ็คของคอมโพเนนท์(สร้างอยู่แล้วอัตโนมัติ ถ้าสร้างจาก WindowBuilder)
- ให้อ็อปเจ็คนั้นเรียกเมท็อดที่ชื่อaddตามด้วยชื่อของอินเตอร์เฟส addxxxx(parameter) เช่น addActionListener
- ภายในพารามิเตอร์ให้สร้าง anonymous inner class ของอินเตอร์เฟสและ อิมพลีเมนต์ เมท็อดของอินเตอร์เฟสให้ทำงานตามที่ต้องการ(จริงๆใช้งานได้หลายแบบแต่ที่นี้จะใช้แบบ anonymous inner classเพราะสามารถ generate ได้อัตโนมัติ)
แต่พูดไปแล้วอาจจะงงต้องลองดูตัวอย่างโครงสร้าง ซึ่งจะออกมาลักษณะนี้
ชื่อคลาสคอมโพเนนท์ ชื่อตัวแปรอ็อปเจ็ค = new ชื่อคลาสคอมโพเนนท์ ("text");
ชื่อตัวแปรอ็อปเจ็ค.addอินเตอร์เฟส(new ชื่ออินเตอร์เฟส() {
public void ชื่อเมท็อด(พารามิเตอร์แบบอ็อปเจ็ค) {
}
});
ชื่อตัวแปรอ็อปเจ็ค.setBounds(x, y, width, height);
contentPane.add(ชื่อตัวแปรอ็อปเจ็ค);
x, y คือตำแหน่งตามแนวแกน x และ y , width, heightคือขนาดกว้างสูง
แต่การเขียนโค๊ตเหล่านี้ก็ไม่จำเป็นเพราะ WindowBuilder สามารถ generate ให้ได้อัตโนมัติอีกเช่นเดียวกัน แต่สิ่งควรรู้คือตำแหน่งสำหรับการ อิมพลีเมนท์เมท็อด
วิธีจัดการอีเวนต์ด้วย WindowBuilder
1. เอาเมาส์ชี้ไปที่คอมโพเนนท์ที่ต้องการจัดการกับอีเวนต์ จากนั้นให้คลิ๊กขวา จะมีคำว่า Add event handler ให้เลือกอันนี้
รูป17-1
เมื่อเลือกที่ Add event handlerจะปรากฏให้เลือกมาต้องการทำอะไร ใช้เมท็อดอะไรดังรูป
รูป17-2
เมื่อเลือกให้ทำอะไรแล้วโค๊ตก็จะมาปรากฏในหน้า source
รูป17-3
ตัวอย่างการใช้งาน
จะสาธิตตัวอย่างการใช้งานอย่างง่ายที่สุดนั่นคือ จะเขียนโปรแกรมให้ผู้ใช้กรอกข้อความเข้ามา จากนั้นให้มี JDialog ทักทายตอบออกไป
เริ่มจากสร้าง GUI สำหรับช่องกรอกชื่อ และปุ่มสำหรับ Enter
รูป17-4
จัดการกับอีเวนต์ของปุ่ม Enter ด้วย ActionListener
รูป17-5
ทำการอิมพลีเมนท์เมท็อด actionPerformed ด้วยการให้แสดง JDialog ออกมาเมื่อมีการคลิ๊กหรือ Enter ที่ปุ่มนี้ โดยให้แสดงข้อความ Hello แล้วตามด้วยชื่อที่ผู้ใช้ได้หรอกเข้ามาโดย getText() มาจากช่อง JTextField ที่สร้างไว้
รูป17-6
ผลลัพธ์ที่ได้ คือเมื่อกดปุ่มจะมี Dialog ขึ้นมา ถ้าไม่ทำการจัดการกับอีเวนต์เวลากดปุ่มก็จะไม่ได้เกิดอะไร
รูป 17-7
Tag ที่น่าสนใจ: java event_handling gui actionevent componentevent containerevent focusevent itemevent keyevent mouseevent mousemotionevent anonymous_inner_class windowbuilder programming tutorial
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM