LAB 02 - Inventory Application
แล็บนี้เราจะลองทำ โปรแกรมคูณเลขง่ายๆดู
ตอนที่ 1
โจทย์
ห้องสมุดรันหนังสือแต่ละครั้งเป็นลังหลายๆลัง
ถ้าให้แต่ละลังมีจำนวนหนังสือเท่ากัน
ผู้ดูแลห้องสมุดต้องการให้นักเรียนทำโปรแกรมง่ายๆให้เขาใช้งานในการรับของหนึ่งครั้งดังนี้
- มีช่องให้ใส่จำนวนลังในการส่งครั้งนั้น
- มีช่องให้ใส่จำนวนหนังสือต่อหนึ่งลัง
- มีปุ่มให้กด "คำนวณจำนวนหนังสือทั้งหมด"
- มีที่แสดงผลลัพธ์ ว่าจำนวนหนังสือทั้งหมดเป็นเท่าไร
ตัวอย่างโปรแกรม เป็นดังรูป
โดยจะมีช่องขาวๆ
ที่พิมพ์ลงไปได้ (เรียกว่า JTextBox) สองช่อง เมื่อพิมพ์ลงไปแล้วกดปุ่ม
(JButton) calculate Total จะปรากฎว่า ผลคูณจะแสดงออกมาใน JTextBox
ที่พิมพ์ไม่ได้ ส่วนตัวหนังสือที่อธิบายต่างๆก็เป็น JLabel หมด ให้วินโดวมีขนาด 354, 112
ก่อนอื่น
จงทำวินโดว์ออกมาให้ได้หน้าตาแบบนี้ก่อน ไม่ต้องขนาดเท่าเป๊ะ
แต่ต้องมีการวางชิ้นส่วนต่างๆในสไตล์เดียวกัน ยังไม่ต้องคำนวณ
ให้เริ่มเขียนคลาส จากโครงนี้ เปลี่ยนโค้ดได้ตามใจ สามารถลบโค้ดเดิมทำใหม่หมดได้ แต่ชื่อต่างๆขอให้คงไว้
- ให้ค่าเริ่มต้นใน JTextField เป็น 0 นะ
- JTextField นั้นเราสามารถเซ็ตคุณสมบัติต่างๆได้เหมือน JLabel เลย
- ต้องทำให้ สิ่งที่พิมพ์ไปใน textfield นั้นอยู่ด้านขวาของตัว textfield
- อย่าลืมว่าต้องให้ edit ผล ไม่ได้ (ใช้เมธอด setEditable)
- JButton ก็สามารถ setText และsetBoundsได้เหมือนกัน
- ถ้าไม่อยากใช้ setBounds ก็ใช้ setLocation กับ setSize แทนก็ได้
- การ
setLayout(new FlowLayout()) หรือ layout แบบอื่นๆ จะทำให้
ของต่างๆปรากฎบนจอได้ โดยไม่ต้อง setBounds
แต่ว่าจะทำให้กำหนดขนาดได้ลำบาก สำหรับการวาง component ในแล็บนี้
เนื่องจากมีไม่เยอะ ดังนั้นใช้พวก setBounds ก็น่าจะเพียงพอ
เอาล่ะ ถ้าทำเสร็จแล้ว ยังมีต่อ คราวนี้เราจะมาทำให้มันคำนวณจริงๆซะที พอกดปุ่มปั๊บ ให้มันคำนวณแล้วโชว์ผลปุ๊บ
ทำได้เลย
ตอนที่ 2
เพิ่มเติมจากตอนที่ 1 - ให้
เมื่อ ผู้ใช้ พิมพ์ข้อมูลลงไปใหม่ ใน JTextField ตัวใดตัวหนึ่งที่รับ
input แล้ว ตัว JTextField ที่โชว์คำตอบ ต้องเคลียร์ด้วย
เพื่อป้องกันการสับสนในคำตอบ
พอทำเสร็จแล้ว ทำเป็น executable jar ไว้ แล้วส่งมาที่ progmethcp@gmail.com ภายในเที่ยงคืนวันที่ทำแล็บนี้ โดยในเมล์ subject ต้องเขียนเป็น studentId_lab02_secNumber และชื่อไฟล์จะต้องเป็น studentId_lab02_secNumber.jar ตัวอย่างเช่น 5032117621_lab02_1.jar
studentID คือเลขประจำตัวนิสิต
secNumber คือเบอร์ตอนเรียน
ไปหน้าการบ้าน
ไกด์
ตอนที่ 1
สำหรับคนที่ยังงงๆหรือทำไม่ได้
ผมจะค่อยๆสอนไปทีละขั้นนะ ขอย้ำอีกทีว่า ให้คิดไปด้วย
อย่าเอาแต่ทำตามอย่างเดียว ไม่งั้นเดี๋ยวไม่เก็ตนะ
ถ้าเราต้องการกดปุ่ม (หรือกดอะไรก็ตาม แล้วให้โปรแกรมทำโน่นนี่)์
- เราต้องสร้าง ตัวฟังเหตุการณ์ (Listener) ขึ้นมา
- ตัวฟังมีหลายประเภท สำหรับที่ฟังการกดปุ่มได้ เรียกว่า actionListener
- เอาตัวฟังไปแปะกับปุ่มที่เราต้องการให้ทำงาน
- จากนั้นก็เขียนโค้ดของตัวฟัง ว่าพอมันฟังอยู่แล้วมีอะไรเกิดขึ้น (เช่นปุ่มถูกคลิก) ให้ทำอะไรบ้าง
เอาล่ะ
สำหรับการสร้างตัวฟัง เพื่อจะฟังปุ่มนั้น เราใช้ตัวฟังประเภท
actionListener (ตัวฟังที่ฟังเหตุการณ์อย่างเช่นการติ๊กถูกผิดในช่อง
จะเป็นประเภทอื่น เรียกไม่เหมือนกัน)
ซึ่งเราสามารถสร้างตัวฟังแล้วไปแปะกับปุ่มได้เลย
ใช้โค้ดนี่
calculateJButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event){
// โค้ดที่จะรันเมื่อ
ตัวฟังรู้ว่ามีปุ่มถูกกด
}
} );
่้
- นี่หมายถึง ปุ่ม calculateJButton นี่ แปะ ActionListener object ไปกะมัน โดยใช้เมธอด addActionListener
- แล้วไอ้ตัว ActionListener
object ที่สร้างขึ้นนี่ ก็มีเมธอด actionPerformed ที่จะรัน
เมื่อได้รับฟังสัญญาณจากสิ่งที่ตัว ActionListener แปะอยู่
- เมธอด ต้อง actionPerformed เท่านั้น ถึงจะรับฟังการ "กดปุ่ม" ได้
- event
นั้น จะถูกสร้างเป็น ActionEvent object ขึ้นมาเองโดยจาวาเมื่อปุ่มถูกกด
เราสามารถเอาตัวแปร event มาดึงข้อมูลเกี่ยวกับการกดเมาส์ครั้งนั้นได้ด้วย
แต่ว่าในที่นี้ก็ไม่ได้ใช้งานอะไรน่ะนะ
- ActionListener , actionPerformed, ActionEvent พวกนี้ จาวา นิยามไว้อยู่ก่อนแล้ว เราแค่ใช้ให้ถูกเท่านั้นก็พอ
- วิธีเขียนแบบ new อะไรขึ้นมา แล้วนิยามเมธอดของมัน ณ ตรงนั้นเลย แบบนี้ เรียกว่า การใช้ anonymous inner class
- สมัยก่อน
ใช้วิธี สร้างคลาสที่ extends ActionListener ขึ้นมาต่างหาก
แล้วเขียนเมธอด actionPerformed ในคลาสนั้น จากนั้นตอนเอามาแปะกับปุ่มก็
new คลาสนั้น แทน ActionListener แต่ว่า ผมว่า นิยามไปในโค้ดแบบ anonymous
inner class น่าจะสะดวกกว่านะ เพราะไม่ต้องสร้างคลาสขึ้นมาใหม่ต่างหากเลย
เราแค่นิยามว่า ไอ้ ActionListener object ที่ถูกสร้างขึ้นใหม่นี้
จะมีโค้ดข้างในอะไรบ้าง แค่นั้นเท่านั้น
หลักๆน่าจะเท่านี้ละ ทีนี้ก็เหลือแค่ให้เราทำการคำนวณให้ได้เท่านั้น ผมจะ hint ให้นิดหน่อยก็แล้วกันนะ
- ใช้เมธอด getText เอา text ที่อยู่ใน textbox ออกมาเป็น String ได้
- อย่าลืม ตัวเลขที่เป็น String จะต้องทำให้เป็น ตัวเลขซะก่อน ถึงจะเอามาคำนวณได้ เคยทำตอนเรียนจาวาแล้วนะ มีเมธอดอยู่นี่นะ
- ในการจะพิมพ์ตัวเลข ลง textbox ก็จะทำไม่ได้ เพราะพิมพ์ได้แค่ String ดังนั้น จะต้องเปลี่ยนเลขที่คำนวณแล้ว ให้เป็น String อีกที
- มีเมธอด String.valueOf( .. ) ให้ใช้นะ
ตอนที่ 2
เอาล่ะ หลักการยังเหมือนเดิม ในเมื่อเราจะทำให้ เมื่อ คนพิมพ์ลงไปในช่อง input แล้ว text ในช่องแสดงผลหายไป
เราก็ทำได้ โดยหลักการดังนี้
- ตัว JTextField เมื่อมีการพิมพ์อะไรลงไป จะเกิด KeyEvent object ขึ้น
- เราก็แค่เอาตัวฟังที่ฟัง
event ชนิดนี้ได้ (KeyListener) ไปแปะกับ JTextField
แล้วเขียนโค้ดในเมธอดของตัวฟังนั้น (เมธอดสำหรับฟังการกดคีย์ ชื่อ
keyPressed(KeyEvent event))
- บอกนิดนึง ตอน new น่ะ ไม่ได้ใช้ new KeyListener() นะ แต่ใช้ new KeyAdapter() ไม่เหมือนกับตอนใช้ ActionListener
- ทั้งนี้เพราะว่า KeyListener
นั้น จริงๆแล้วมีหลายเมธอด ถ้าเราจะเขียนโค้ดภายในของ KeyListener
ที่สร้างแบบ anomymous inner class เอง จะต้องเขียนทุกเมธอด
เนื่องจากจาวาบังคับไว้กับ Listener ทุกแบบ (ตอนที่ใช้ ActionListener
นั้น ActionListener ถูกนิยามให้มีแค่เมธอดเดียว ก็เลย addActionListener
ได้เลย ไม่ต้องกลัวเขียนหลายเมธอด)
- แต่ว่า ถ้าใช้ KeyAdapter จะเลือกนิยามโค้ดของเราแค่หนึ่งเมธอดได้
ส่งแล้ว ทำการบ้านต่อด้วย
ไปหน้าการบ้าน