บทท่ี 11: GUI และ Event Handling intro. to Java (FEU.faa)
ภาพที่ 11.29 แสดงขอ มูลเม่อื ผูใ ชเลือก jRadioButton2 (Weight)
ขน้ั ตอนตอไปก็คือการสนองตอบตอ เหตุการณใ น JTextField และ JScrollBar โดยในขัน้ แรกนี้
เราจะเร่ิมจาก JTextField กอน
เรมิ่ ตน ดวยการเลอื ก jTextField1 กดปมุ ขวาบน mouse เลือก Events Æ Action Æ
actionPerformed เรากจ็ ะได method actionPerformed() ทไ่ี มมี code และเราตองใส code
ดงั นี้
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
value = Double.parseDouble(jTextField1.getText());
jScrollBar1.setValue((int)value);
actionMtoU(value);
}
เราดึงเอาขอมูลออกจาก jTextField1 แลวนาํ ไปเกบ็ ไวใน value (เราประกาศใหเปน class
variable) หลังจากนน้ั เรากก็ าํ หนดใหค าใน jScrollBar1 เปนคาเดียวกนั กับคาที่เขา มาจาก
keyboard ดวยการเรียกใช method setValue() แตเนอ่ื งจากวาเราสามารถกาํ หนดคา จาก int
เทาน้นั เราจงึ ตอ งเปล่ยี นคา value จากเดิมทเี่ ปน double ใหเ ปน int
เราตอ งไมล ืมวา ผูใชตอ งกดปมุ Enter กอ นการสนองตอบเหลานี้จึงเกดิ ขนึ้ สวนสําคญั ทีเ่ ราตอง
ทาํ ตอไปก็คอื เปล่ยี นขอมลู ทผ่ี ูใชใ สเขา มาใหเปน อีกหนว ยหนึง่ ใน jTextField2 โดยกําหนดให
เรียก method actionMtoU()
private void actionMtoU(double value) {
char type;
if(jRadioButton1.isSelected())
type = 'D';
else if(jRadioButton2.isSelected())
type = 'W';
else
type = 'T';
int index1 = jComboBox1.getSelectedIndex();
int index2 = jComboBox2.getSelectedIndex();
result = convertMtoU(value, type, index1, index2);
jTextField2.setText(String.valueOf(result));
}
เราตอ งตรวจสอบใหด วี าคา ใน component ตา ง ๆ สมั พนั ธก ัน ทัง้ นก้ี เ็ พื่อใหก ารเปลี่ยนหนว ย
ถกู ตองกบั การวดั ทผ่ี ูใชเ ลอื ก เชน จาก Centimeters Æ {Inches, Feet, Yards, Miles} โดยเรา
กาํ หนดให 'D' เปน ระยะทาง 'W' เปน นํา้ หนกั และ 'T' เปนอณุ หภูมิ การเปล่ียนหนว ยเกิดข้ึนใน
method convertMtoU() ซ่ึงเปน method ทใี่ ชต วั แปร value, type, index1 และ index2 เปน
parameter ซ่ึงมกี ารทาํ งานดงั นี้
397
เรม่ิ ตน การเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
private double convertMtoU(double value, char type, int i, int j) {
double multiplier = 0;
double result = 0;
switch(type) {
case 'D': multiplier = mdUnit[i].getMultiplier() /
udUnit[j].getMultiplier();
result = value * multiplier;
break;
case 'W': multiplier = mwUnit[i].getMultiplier() /
uwUnit[j].getMultiplier();
result = value * multiplier;
break;
case 'T': result = value * 9 / 5 + 32;
break;
}
return result;
}
คาทไี่ ดจ ากคาํ นวณใน method convertMtoU() กจ็ ะถูกนาํ ไปแสดงใน jTextField2 ตอไป
การสนองตอบเม่ือผูใชใ สขอ มลู ใน jTextField2 กค็ ลาย ๆ กบั ที่เราทําใน jTextField1 ตางกัน
ตรงท่ีเราเรยี กใช method actionUtoM() และ method convertUtoM() แทนซึ่งมี code ดงั นี้
private void actionUtoM(double value) {
char type;
if(jRadioButton1.isSelected())
type = 'D';
else if(jRadioButton2.isSelected())
type = 'W';
else
type = 'T';
int index1 = jComboBox1.getSelectedIndex();
int index2 = jComboBox2.getSelectedIndex();
result = convertUtoM(value, type, index2, index1);
jTextField1.setText(String.valueOf(result));
}
private double convertUtoM(double value, char type, int i, int j) {
double multiplier = 0;
double result = 0;
switch(type) {
case 'D': multiplier = udUnit[i].getMultiplier() /
mdUnit[j].getMultiplier();
result = value * multiplier;
break;
case 'W': multiplier = uwUnit[i].getMultiplier() /
mwUnit[j].getMultiplier();
result = value * multiplier;
break;
case 'T': result = (value - 32) * 5 / 9;
break;
}
return result;
}
สวนสุดทา ยทีเ่ ราตองทาํ ก็คือการเขยี น code รองรับถาผูใชเ ลือกเปลยี่ นขอ มูลใน JScrollBar
(ดว ยการเลอ่ื นไปมา)
ข้ันตอนกค็ อื เลือก Events Æ Adjustment Æ adjustmentValueChanged บน jScrollBar1
เรากจ็ ะได method (เชน เดยี วกันกบั code ทเ่ี กิดข้ึนโดยอตั โนมัติในการดักฟงเหตกุ ารณอ ืน่ ๆ –
นั่นก็คอื ไมม ี code! - ตองเขยี นเอง)
private void jScrollBar1AdjustmentValueChanged(
java.awt.event.AdjustmentEvent evt) {
double scbValue = (double)jScrollBar1.getValue();
jTextField1.setText("" + scbValue);
actionMtoU(scbValue);
}
398
บทที่ 11: GUI และ Event Handling
Code ท่อี ยภู ายในกไ็ มมีอะไรซบั ซอ นเราแคด ึงคา ออกจาก jScrollBar1 สงออกไปยัง
jTextField1 เรยี กใช method actionMtoU() ดว ยคาใน jScrollBar1 น้ีคา ในสว นอ่ืน ๆ ทีม่ ีการ
ดกั จับเหตกุ ารณก จ็ ะทําหนาทใี่ นการเปล่ียนคา ตามทต่ี วั เองรบั ผดิ ชอบ
ภาพที่ 11.30 คาที่เปลี่ยนไปใน jTextField1 และ jTextField2 ถาผใู ชเ ล่อื นปุม ใน jScrollBar1 intro. to Java (FEU.faa)
เชน เดยี วกนั การเขยี น code รองรบั การเปล่ยี นของ jScrollBar2 ก็คลายกนั เราเพียงแตเ ปลี่ยน
code ใหเปน
private void jScrollBar2AdjustmentValueChanged(
java.awt.event.AdjustmentEvent evt) {
double scbValue = (double)jScrollBar2.getValue();
jTextField2.setText("" + scbValue);
actionUtoM(scbValue);
}
หนา ตาของโปรแกรมทผ่ี ูอา นไดอ าจไมคอยเหมือนกบั ท่ีเห็นน้ี ทง้ั นกี้ ็อาจขน้ึ อยูกบั font ทีใ่ ช
ขนาดหรอื การเปลยี่ นแปลงอื่น ๆ ใน Properties ของ component นั้น ๆ ผอู านสามารถทดสอบ
ดวยการเปล่ียน properties เหลานี้เอง
ณ จดุ นี้ผูอา นอาจจะสงสยั วา ทาํ ไมไมมอี ะไรแสดงเลยหลังจากท่ี compile และ run โปรแกรม
ยงั ไมจบครบั เรายงั ตองไปเขียน code อีกสกั สองหรอื สามบรรทดั ภายใน Main ท่ี Netbeans
สรางขึ้น ดังนี้
public static void main(String[] args) {
//sets Java's LAF
JFrame.setDefaultLookAndFeelDecorated(true);
ConversionForm cfr = new ConversionForm();
cfr.setVisible(true);
}
การ compile และ run โปรแกรมทที่ าํ ไดง า ย ๆ กค็ ือ กดปุมใน tool bar
Build Main Project Run Main Project
Clean & Build Main Project
399
เร่ิมตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
ในสว นของตวั แปร (global variables) ทเ่ี ราใชมดี ังน้ี (ประกาศตามหลังตวั แปรที่ Netbeans
สรา งข้นึ ใน ConversionForm.java)
private Unit[] mdUnit;
private Unit[] udUnit;
private Unit[] mwUnit;
private Unit[] uwUnit;
private double value;
private double result;
โปรแกรมตัวอยา งท่เี ราแสดงใหดเู ปนตัวอยา งงา ย ๆ ทแ่ี สดงใหเหน็ ถึงความสามารถของ
Netbeans ในการสรา ง GUI ทม่ี หี นา ตาดูแลว สวยงาม ใชเ วลานอ ยในการสรา ง (ไมเหมอื นกับ
การสรา งดวยการเขยี น code เชนทที่ ํากอ นหนา น)ี้ ผอู านสามารถลดเวลาในการพัฒนาโปรแกรม
ท่มี ีความซบั ซอ นลงไดอยา งมาก ทาํ ใหมเี วลาในการพฒั นาสว นที่เปน logic ของโปรแกรมมาก
ขึ้น
[Run โปรแกรมภายนอก Netbeans IDE]
ถงึ ตอนนเ้ี รา run โปรแกรมไดเพยี งแคผ านทาง IDE ของ Netbeans เทาน้นั ซ่ึงอาจไม
สนองตอบตอความตอ งการของบางคนไดด ีพอ ดงั นัน้ เพื่อใหโปรแกรมทีเ่ ราสรางข้ึนสามารถ run
ในท่ีอนื่ ๆ ไดเ รากเ็ พยี งแคหาไฟลส าํ คญั ๆ ท่ี Netbeans สรา งข้ึนโดยมขี ้ันตอนดังนี้
1. หา folder: dist ใน path ทีเ่ ราสรา ง project ของเรา
2. run โปรแกรมดว ยคําสัง่ java –jar conversion.jar
ถาเราตอ งการทจี่ ะ run ไฟลข องเราในท่อี ืน่ เรากต็ อ งเอาไฟลท ุกตวั ใน folder น้ีไป วธิ กี ารท่ีงา ย
ที่สดุ กค็ ือการบบี อดั (zip) เพือ่ นาํ ไปขยายในทอี่ ่นื ที่เราตอ งการ run โปรแกรม ภาพที่ 11.31
แสดงไฟลท ุกตวั ใน project conversion ทส่ี รา งขึ้นโดย Netbeans ผอู า นจะเห็นไฟล
conversion.jar ไฟล README.TXT และไฟล swing-layout-1.0.jar ซ่งึ เปนไฟลที่ Netbeans
ใชใ นการจดั วาง component ใหเราเพราะฉะนน้ั เราตอ งเอาไฟลต วั นี้ไปดวย
ภาพท่ี 11.31 dist folder และไฟลท ่อี ยภู ายใน (มองผาน Files tab ของ Netbeans)
ขัน้ ตอนสน้ั ๆ เพียงเทานี้กท็ ําใหเราสามารถทจี่ ะ run โปรแกรมทเ่ี ราสรา งขน้ึ จาก Netbeans ใน
ท่ีอ่นื ๆ ท่ีไมใชภ ายใน IDE ได
ถา ผูอ านอยากรวู า ไฟลท มี่ ีอยใู น conversion.jar มีอะไรบางก็ใชค าํ สั่ง jar xvf conversion.jar
เพ่อื ทําการแตกไฟลออก
400
บทที่ 11: GUI และ Event Handling
ภาพที่ 11.32 การขยาย (extract) ไฟล conversion.jar intro. to Java (FEU.faa)
เราคงไมพ ูดถงึ กระบวนการสรา ง jar ไฟลในทน่ี ้ี ผอู า นสามารถหาดูไดจ ากหนังสือหรอื web site
ตา ง ๆ ไดอ ยา งงาย ๆ ภาพดา นบนนี้แสดงถงึ ไฟลตาง ๆ ทจ่ี าํ เปน ในการ run project ทีเ่ ราสรา ง
ขึน้ โดย Netbeans จะทําการบีบอดั ไฟลเหลา นใี้ หเ ราเองเมอ่ื เราทําการ build project ภายในตวั
IDE เองทนี่ าสนใจอีกอนั หนงึ่ ก็คือขอ มูลทมี่ ีอยูในไฟล MANIFEST.MF
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.5.0_06-b05 (Sun Microsystems Inc.)
Main-Class: edu.fec.it.conversion.Main
Class-Path: lib/swing-layout-1.0.jar
X-COMMENT: Main-Class will be added automatically by build
เราจะเหน็ ไฟล Main และ swing-layout-1.0.jar ซ่ึงเปน ไฟลสําคญั ทงั้ สองตัวโดยตัวแรกจะเปน
จดุ เริม่ ตน (entry point) ในการ run และตวั ท่สี องเปน layout ทีถ่ ูกใชโ ดย Netbeans ในการจัด
วาง component ตา ง ๆ ใหเรา
[เปลย่ี น Main.class ใหเ ปน ชอ่ื ท่ีเราตอ งการ]
ในตอนแรกท่เี ราสรา ง project: conversion น้นั เราใชช ื่อท่ี Netbeans กาํ หนดใหเราคือ Main
แตถา เราไมต อ งการใชช ่อื น้เี รากส็ ามารถเปลย่ี นใหเ ปนอยา งอืน่ ตามทเี่ ราตองการได วิธีการกง็ า ย
ๆ คือ เปล่ยี นชอื่ จาก Main ใหเ ปน ช่อื ท่ีเราตองการตอนเร่มิ ตน project
เปล่ยี นชอื่ จาก Main ให
เปนชื่อท่เี ราตองการ เชน
SomeClass ดงั ทเี่ หน็ น้ี
ภาพท่ี 11.33 เปลี่ยนชื่อ class จาก Main ใหเปนชอื่ ทีเ่ ราตองการ
401
เรมิ่ ตนการเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
[ใสลูกเลนใหก ับโปรแกรม conversion]
เราอยากทจี่ ะใหโ ปรแกรม conversion ของเรามกี ารแสดงเวลาขณะทีโ่ ปรแกรมกําลงั run อยู
ทางดา นขวาลางของ form เชน ทีเ่ หน็ จากภาพน้ี
ภาพท่ี 11.34 โปรแกรม conversion ทีม่ ีการแสดงเวลา
กระบวนการในการทาํ กไ็ มย าก เราเพียงแตเพม่ิ class TimeOfDay เขา สู class
ConversionForm ดังนี้ (ใหเ ปน inner class)
class TimeOfDay implements ActionListener {
public void actionPerformed(ActionEvent e) {
SimpleDateFormat tf = new SimpleDateFormat("hh:mm:ss", getLocale());
String st = tf.format(new Date());
jLabel1.setText(st);
}
}
ภายใน constructor ของ ConversionForm เรากเ็ พ่มิ code
time = new TimeOfDay();
timer = new Timer(1000, time);
timer.start();
โดยเราจะใช jLabel1 เปนตวั แสดงเวลาทเี่ ปลยี่ นไปทุก ๆ หนงึ่ วนิ าที ผา นทาง class Timer ที่
ถกู เรยี กใน constructor ผานทาง method start()
[เปลีย่ นโปรแกรม conversion ใหพดู ภาษาไทย]
การกาํ หนดใหข อความทอ่ี ยใู นโปรแกรมใหใชภาษาไทยเปน ภาษาในการสอ่ื ถึงผใู ชน้ัน ทําไดงา ย
ๆ ดวยการกําหนด properties ไฟลใ หกับตวั โปรแกรมของเรา เพื่อใหเหน็ ถงึ ตัวอยางเราจะ
เปล่ียนขอความทีแ่ สดงในหนา ตา งหลัก ใหเปน
ภาพที่ 11.35 เปล่ียนขอ ความในหนาตา งใหใ ชภ าษาไทย
ขน้ั ตอนแรกทีเ่ ราตองทํากค็ อื สราง properties ไฟล
1. เลือก File Æ New File
2. เลอื ก Properties File จาก Other category เสร็จแลวกดปุม Next
402
บทท่ี 11: GUI และ Event Handling
3. กาํ หนดให properties ไฟลมชี ื่อเปน Bundle โดยกาํ หนดใหอ ยภู ายใต path ท่เี ราใช
ในโปรแกรมของเรา (ใช Browse ในการหา)
4. กดปมุ OK intro. to Java (FEU.faa)
การกําหนดใหม ภี าษาไทยใชใ นโปรแกรมน้นั เราจะเรมิ่ ตน ดว ยการเลือก component ท่เี รา
ตองการแสดงใน form หลกั ของเรา (ConversionForm)
1. เลอื ก Distance ในพืน้ ทข่ี องการออกแบบ
2. ในหนาตา ง Properties กดปุม … ของ Text property เรากจ็ ะไดห นา ตา ง pop-up
ข้นึ มา
3. เลือก Resource Bundle ใน combo box: Select Mode ซึ่งจะทาํ ให editor
เปลย่ี นเปน resource bundle
4. ภายใน Bundle Name field ใหหาไฟล Bundle.properties
5. ใสค า Distance ใน fields: Key และ Value
6. กดปมุ OK
7. ทาํ แบบเดยี วกนั น้ีกบั Weight และ Temperature
[กาํ หนด Locale ใหม (ไทย)]
1. กดปุมขวาบน mouse ของ node: Bundle.properties ในหนา ตาง Projects
2. เลือก Add Locale
3. ใส th ใน Language code (หรอื เลือกจาก list)
4. ใส TH ใน Country Code
5. กดปุม OK เรากจ็ ะได locale ใหมภ ายใน Bundle.properties
6. ภายในหนาตาง Projects กดปุมขวาบน Bundle.properties เลือก Open
7. เปลี่ยนคาในหนา ตา งใหเปนไปตามทเ่ี ราตอ งการ
403
เรมิ่ ตน การเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)
[ทดสอบ locale ใหมท เ่ี รากําหนดขนึ้ ]
1. ในหนาตา ง Projects กดปุมขวาบน conversion เลอื ก Properties
2. ภายใต Categories เลือก Run
3. ใส –Duser.language=th –Duser.country=TH ในชอ ง VM Options
4. กดปมุ OK
5. กดปุม ขวาบน project: conversion เลอื ก Run
เรากจ็ ะไดห นา ตางทมี่ ภี าษาไทยใน JRadioButton แทนภาษาองั กฤษดงั ทไ่ี ดแ สดงใหด กู อ น
หนานี้
ผูอา นตอ งอยา ลืมกาํ หนดใหภาษาทแี่ สดงใน Windows เปนภาษาไทย (ทําผา น control panel)
กอ นจึงจะทําใหโ ปรแกรมของเราทาํ งานในแบบภาษาไทยได (กําหนดใหภ าษาไทยเปน default
locale)
[กาํ หนดการใชภ าษาไทยในขณะทีโ่ ปรแกรมกาํ ลัง execute]
ตัวอยา งการใชภ าษาไทยในตวั อยางกอนหนา นเ้ี ปนการทาํ ในชว งเวลาของการออกแบบ (เขยี น)
โปรแกรม ซ่ึงสว นใหญจ ะเปน การเปล่ยี นคา ของ string ทแ่ี สดงขอ ความสื่อถึงผใู ชใ นรูปแบบตาง
ๆ ในบางคร้งั เราตองการกาํ หนดคาของ string เหลานี้ ณ เวลาทีโ่ ปรแกรมกาํ ลัง execute อยู
เชน กาํ หนดคา ของขอ มลู ใน combo box ดงั ท่เี ราทาํ ในโปรแกรม conversion
โปรแกรมตวั อยา งทเ่ี ราจะแสดงใหด เู ปนการกาํ หนดการใชภ าษาดว ยการใช resource bundle
จาก locale ทกี่ าํ หนดจากโปรแกรม ดังทแ่ี สดงใหด ใู นภาพที่ 11.36 นี้
ภาพที่ 11.36 หนาตา งเริ่มตนเม่อื run โปรแกรม
โปรแกรมตัวอยา งนจี้ ะกาํ หนดใหม ขี อ มูลใน combo box หลังจากทผี่ ใู ชไดก ดปุม Thai โดยจะ
กําหนดใหเปน เดือนในภาษาไทยจาก มกราคมไปจนถึงธันวาคม พรอมกบั เปลีย่ นขอ ความบนปุม
ใหเ ปน English ซึ่งเมอื่ ผูใชกดปมุ อกี ครั้งขอมลู ใน combo box กจ็ ะเปลยี่ นเปน เดือน January
ไปจนถงึ เดือน December และทกครั้งทม่ี กี ารกดปุม หรอื เลอื กขอ มูลใน combo box เราก็จะ
แสดงขอมลู น้นั ใน text area ดานลา ง
404
บทท่ี 11: GUI และ Event Handling intro. to Java (FEU.faa)
ภาพท่ี 11.37 ผลลัพธบ างสว นหลังจากผใู ชกดปุม (และเลือกเดือน)
ขน้ั ตอนการสรางก็คลา ยกบั ที่เราไดท าํ มากอนหนา น้ี ตางกันตรงท่วี า เราตองสรา ง properties file
ใน Source Packages และเรยี กใช Resource Bundle ภายในโปรแกรม ภาพที่ 11.38 แสดง
ตาํ แหนงของ properties file (ตาํ แหนงจะตา งกบั โปรแกรม conversion)
ภาพท่ี 11.38 ตาํ แหนงของ properties file ท่เี ราตองสราง
โดยเราจะกําหนดใหมี locale สองตัวคอื en_US และ th_TH ซง่ึ มีขอ มลู ดงั นี้
การกาํ หนดการสนองตอบตอ event ทเ่ี กดิ ข้ึนทาํ สองที่ คือ เมอ่ื ปุมถูกกด และเม่อื combo box
ถูกเลือก ซึ่งมี code ดงั น้ี
405
เรม่ิ ตน การเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String caption = jButton1.getText();
if(caption.equalsIgnoreCase("Thai")) {
jButton1.setText("English");
ResourceBundle f = ResourceBundle.getBundle("Months", thLocale);
populateComboBox(f);
}
else {
jButton1.setText("Thai");
ResourceBundle f = ResourceBundle.getBundle("Months", usLocale);
populateComboBox(f);
}
}
private void populateComboBox(ResourceBundle f) {
jComboBox1.removeAllItems();
jComboBox1.addItem(f.getString("Jan"));
jComboBox1.addItem(f.getString("Feb"));
jComboBox1.addItem(f.getString("Mar"));
jComboBox1.addItem(f.getString("Apr"));
jComboBox1.addItem(f.getString("May"));
jComboBox1.addItem(f.getString("Jun"));
jComboBox1.addItem(f.getString("Jul"));
jComboBox1.addItem(f.getString("Aug"));
jComboBox1.addItem(f.getString("Sep"));
jComboBox1.addItem(f.getString("Oct"));
jComboBox1.addItem(f.getString("Nov"));
jComboBox1.addItem(f.getString("Dec"));
}
private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {
String month = (String) jComboBox1.getSelectedItem();
if(month != null)
jTextArea1.append(month + "\n");
}
ทุกครัง้ ทผ่ี ูใ ชก ดปมุ (ซ่งึ อาจเปน "Thai" หรอื "English") เราก็จะดึงเอาคาที่อยบู นปมุ ออกเพื่อ
ตรวจสอบวา เราตองกาํ หนดขอ มลู ใน combo box วาควรเปน ภาษาไทยหรอื ภาษาองั กฤษ และ
เม่อื ไดแ ลว เราก็เรยี กใช properties ท่ีเราเขยี นขึ้นผานทาง resource bundle เชน
ResourceBundle f = ResourceBundle.getBundle("Months", usLocale);
Java กจ็ ะไปคนหา properties ไฟลท ี่ขนึ้ ตน ดวย Months ตามดว ย locale: th_TH หรอื en_US
ท่เี ราไดกําหนดไวจ ากการเรียก หลงั จากน้ัน (ถาหาไฟลเจอ) เรากท็ าํ การกาํ หนดคา ใหก บั
combo box ดว ย
jComboBox1.removeAllItems();
jComboBox1.addItem(f.getString("Jan"));
โดยเราเรม่ิ ตน ดว ยการลบคา เกา ท่อี ยอู อกกอ น หลงั จากนนั้ จงึ ทาํ การใสขอมลู ท่ดี ึงออกมาจาก
properties ไฟลต ามคา ของ key ผานทาง method getString() ของ resource bundle
เนอื่ งจากวาเราทําการกาํ หนดคาของขอ มลู ใน combo box จากการกดปุม ซงึ่ การกระทาํ ดงั กลา ว
จะทาํ ใหเ กดิ event ขน้ึ ใน combo box ดังนน้ั ขอ มูลกจ็ ะถกู สง ไปยงั text area ดวย เพราะฉะนนั้
ทกุ คร้ังของการกดปมุ เราก็จะเหน็ เดอื นที่อยดู า นบนสดุ ของ combo box แสดงออกทาง text
area (January หรอื มกราคม) เสมอ
[การใช Internationalization Wizard]
เราจะใชโ ปรแกรมการสราง GUI ตวั อยา งท่ีมากับ Netbeans 5.0 เปนตวั อยา งการเปลยี่ น string
ท่มี ีอยูในโปรแกรมท้ังหมดใหเ ปนภาษาไทย โดยเราจะใช internationalization wizard เปนตวั
ชว ย
เราจะเร่มิ ตนขนั้ ตอนดงั น้ี
406
บทท่ี 11: GUI และ Event Handling intro. to Java (FEU.faa)
1. เลอื ก File Æ New Project
2. ภายใต Categories เลือก General และเลอื ก GUI Form Example แลว กดปมุ Next
3. ผอู านสามารถเปลี่ยนช่อื project ไดถ าตองการ ในทีน่ เี้ ราจะใชช่ือท่กี าํ หนดมา คือ
GUIFormExamples
เมอ่ื ทาํ เสรจ็ แลว เราก็จะเห็นไฟล readme.txt ซ่ึงเปนไฟลท บี่ อกถงึ สว นประกอบตา ง ๆ ท่ีมอี ยูใน
ตวั อยา ง และเมอ่ื กดดูไฟลใ น project folder เราก็จะเห็นไฟลตา ง ๆ ดังนี้
ขนั้ ตอนตอ ไปก็คอื การสรา ง properties file ใหก บั form ท่ีมอี ยู ซึง่ เราจะทําใหกับ Antenna
และ ContactEditor สวน Find เราจะทง้ิ ไวเฉย ๆ
1. กดปุม ขวาบน examples node ใน Projects Tab เลือก New Æ Properties File
2. ใสช อ่ื ContactEditor แลว กดปมุ Finish
เราจะเห็น Contact.properties ไฟลใ น examples folder ซงึ่ จะถกู เปด ไวใ น Source editor
ดวย (เราจะทาํ อยา งเดยี วกนั นก้ี บั Antenna.properties ไฟลดว ยกไ็ ด)
ตอไปเราจะเรยี ก Internationalization wizard ข้ึนมาทํางาน
1. กดปมุ ขวาบน Source Packages เลอื ก Tools Æ Internationalization Æ
Internationalization Wizard
2. เพอื่ ใหเราไมตอ งกังวลกับการทาํ งาน เราจะลบ examples.Find ออกดวยการเลือก
Find แลวกดปมุ Remove Source(s) (ลบ Antenna ดวยกไ็ ด)
407
เร่มิ ตน การเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)
3. กดปมุ Next เราก็จะไดห นาจอคลาย ๆ กบั ทีเ่ หน็ น้ี
4. เมื่อทาํ การ save ไฟลแ ลวข้นั ตอนตอไปก็คอื การเพม่ิ locale ท่ตี อ งการ เพอื่ ใหงายขน้ึ
เราจะทําเฉพาะ ContactEditor เทา นน้ั
5. ขั้นตอนทเ่ี หลือกค็ ือการทดสอบ locale เชนทไี่ ดท าํ กอนหนา นี้ (ใส –
Duser.language=th –Duser.country=TH ใน VM Options ของ Run ใน
Properties ของ GUIFormExamples project)
408
บทท่ี 11: GUI และ Event Handling
เรากจ็ ะไดผ ลลพั ธคลาย ๆ กับทเี่ ห็นนี้
ทุกครงั้ ท่ีเราทําการเปลยี่ นแปลง source code เราจะตอ งทาํ การเรยี ก Internationalization intro. to Java (FEU.faa)
Wizard ขนึ้ มาใชเ พือ่ ใหการเปลย่ี นแปลงที่เกดิ ขนึ้ มผี ลตอโปรแกรมของเรา (ถงึ แมวา จะไมม ีการ
เปลย่ี นแปลงตวั properties ไฟลก ต็ าม การเปลี่ยนแคน อ ยนดิ เชน ขนาดของ font กม็ ผี ล ดงั นัน้
เราตองไมล ืมทจี่ ะเรยี ก Internationalization Wizard หลงั การเปล่ยี นแปลงนน้ั ๆ)
Netbeans เปนเครื่องมือทด่ี ที ส่ี ดุ ตัวหน่งึ ในการพัฒนาโปรแกรมทต่ี อ งใช UI ในการโตต อบกับ
ผูใช โปรแกรมตัวอยา งท่ีเราแสดงใหดเู ปน โปรแกรมเล็ก ๆ ทแี่ สดงถึงการใช UI component
ตาง ๆ (บางสว น) ที่ Netbeans มใี ห ผูอ านควรฝกฝนการใช Netbeans ในการสรางโปรแกรมอ่นื
ๆ เพือ่ ใหเกิดความคลองตัวและสามารถใช Netbeans ไดอยา งมปี ระสทิ ธภิ าพตอ ไป
สรปุ
ในบทน้ีเราไดแสดงกระบวนการ และวธิ กี ารเรยี กใช component ตา ง ๆ สําหรับการสรา ง
โปรแกรมงาย ๆ หลายโปรแกรม รวมไปถงึ การใช event listener ตาง ๆ ที่ Java มใี ห นอกจากน้ี
เรายังไดแ สดงวธิ ีการใช Netbeans ในการสรา งโปรแกรมแบบทีเ่ รียกวา visual programming
ซงึ่ เปนการลดขน้ั ตอนในการพฒั นาโปรแกรมในสว นของ UI โดยรวมแลว เราไดพูดถึง
9 การใช JButton, JLabel, JRadioButton, JComboBox, JCheckBox, JTextField,
JTextArea, JSlider, JSpinner, JProgressBar, ProgressMonitor, JFileChooser,
JMenuBar, JMenu, JMenuItem
9 การใช layout manager: FlowLayout, GridLayout, BorderLayout
9 การดักฟง event ตา ง ๆ และการสนองตอบตอ เหตุการณน นั้ ๆ
9 การใช Netbeans ในการพฒั นาโปรแกรม
9 การใช internationalization ในโปรแกรม
แบบฝก หดั
1. จงออกแบบ GUI สาํ หรบั โปรแกรมตวั อยาง (Interest.java) ในบททสี่ าม แทนท่ีจะรับขอมูล
แบบเดมิ ใหใ ช JTextField รับขอมูลทงั้ สามตวั แทนและจะประมวลผลเมือ่ ผใู ชก ดปุมเทา นน้ั
การแสดงผลใหใ ช JTextArea
409
เร่ิมตน การเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
2. จงออกแบบ GUI สาํ หรบั โปรแกรมการหา ตวั หารรว มมาก (GCD) และตัวคณู รว มนอย
(LCM) ของตัวเลขสองตวั ที่รบั เขามาทาง JTextField ใหแสดงผลลัพธอ อกทาง JLabel (ดู
คาํ อธบิ ายเรอ่ื ง GCD และ LCM จากโจทยท า ยบททส่ี าม)
3. จงออกแบบ GUI สาํ หรับโปรแกรม Text Editor อยา งงา ยทยี่ อมใหผ ูใ ช คน หาคําที่ตอ งการ
ได ทําการ cut และ paste ได ลองดโู ปรแกรม Notepad เปนตวั อยาง
4. จงออกแบบ GUI สาํ หรบั โปรแกรมการเปลยี่ นสกลุ เงินตา ง ๆ เชน US Dollar, British
Pound, Japanese Yen โดยมสี กลุ เงนิ ไมนอยกวาหา สกลุ การเปลย่ี นสกลุ จะเกิดขึ้นเมื่อผใู ช
ใสส กุลเงนิ ใดสกลุ หนง่ึ เสรจ็ (หลงั จากการกดปมุ )
5. จงออกแบบ GUI สาํ หรับโปรแกรมเคร่อื งคดิ เลขฐาน ทมี่ คี วามสามารถในการเปลย่ี นเลขฐาน
หลัก ๆ ที่เก่ียวขอ งกบั คอมพวิ เตอร พรอ มท้ังสามารถท่จี ะ บวก ลบ เลขตาง ๆ เหลา นี้ได
6. จงออกแบบ GUI สําหรบั โปรแกรมทที่ ําการ simulate การคํานวณดอกเบ้ียของบัญชีเงิน
ฝากทม่ี ีการนําเงนิ เขาและออกแบบ random การคํานวณตองคาํ นงึ ถงึ คาความถูกตอ งของ
เงนิ ณ เวลาน้ัน ๆ ดวย โปรแกรมควรมีการใช Thread เพือ่ แกปญ หาเรื่อง Critical Section
โปรแกรมควรคดิ ดอกเบี้ยทกุ ครั้งทีม่ กี ารฝากเงนิ ท่มี ากกวา 1000 บาทและหกั คาโสหยุ ทุก
ครงั้ ทม่ี กี ารถอนเงินเกิน 500 บาท
410