More Related Content More from Theeravaj Tum (20) บทที่ 13 การดักจับเ2. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
301
เนื้อหาบทเรียน
♦ Event Handling
♦ Interface ActionListener
♦ Button , Events and Others Swing basics
3. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
302
Event Handling
คือ การจัดการกับเหตุการณ หรืออีเวนต(event) ที่เกิดขึ้นในโปรแกรม เชน การลากเมาสผาน
ลาเบล การคลิกเมาส การดับเบิลคลิกเมาส หรือกดปุมบนคียบอรดเปนตน ในบทที่ 12 ไดเรียนรูแตการ
สรางหนาจอแตยังไมมีการจัดการกับเหตุการณตางๆที่เกิดขึ้นในโปรแกรม ซึ่งเมื่อเกิดการกระทําใดๆ
กับโปรแกรมก็ตาม โปรแกรมจะไมมีการตอบสนองใดๆ ทั้งสิ้น ในบทนี้เราจะศึกษาถึงวิธีการจัดการกับ
เหตุกาณตางๆ เหลานั้น โดยศึกษาจากตัวอยางโปรแกรมตางๆ ในบทนี้
รูปภาพแสดงเหตุการณ(event) ที่กระทําโดย component ตางๆ ถูกจัดการดวยออบเจ็คที่ชื่อ listener
Interface ActionListener
เปน interface ที่ทําการดักจับเหตุการณตางๆ ดังนั้นหากตองการใชงาน ตองทําการ implement
และ override method ตางๆ ที่อยูภายใน interface นี้
4. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
303
ตัวอยางโปรแกรมที่ประกอบดวย Button , Events , TextArea และ Swing basics อื่นๆ
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
//ออบเจ็ค listener จะกระทําการใดที่ตอบสนองตอ event ที่เกิดขึ้น
import java.awt.event.ActionEvent;
// ออบเจ็ค event เปนออบเจ็คที่สงสัญญาณ(listener)ไปยังออบเจ็คอื่น
import java.awt.Color;
import java.awt.Container;
public class ColoredWindow implements ActionListener{
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
JFrame colorFrame ;
Container contentPane;
JTextArea txt;
JButton btn;
public static void main(String args[]) {
ColoredWindow cw = new ColoredWindow();
cw.init();
}
void init(){
colorFrame = new JFrame("Color Frame");
contentPane = colorFrame.getContentPane();
colorFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane.setLayout(new BorderLayout());
txt = new JTextArea(5,20);
btn = new JButton("Click");
colorFrame.setSize(WIDTH,HEIGHT);
contentPane.add(txt,BorderLayout.CENTER);
5. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
304
contentPane.add(btn,BorderLayout.SOUTH);
btn.addActionListener(this);
colorFrame.show();
}
public void actionPerformed(ActionEvent e){// override method จาก interface ActionListener
txt.setBackground(Color.YELLOW);
//contentPane. setBackground(Color.YELLOW);
}
}
ผลลัพธที่ไดจะปรากฎหนาจอ Window สวน textArea พื้นสีขาวแลวคลิกปุม Click พื้นหลังของ
textArea จะกลายเปนสีเหลือง ทําการการปดโดยคลิกปุม ปด(x)
ตัวอยางโปรแกรมที่ประกอบดวย Button , Events , TextArea และ Swing basics อื่นๆ
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class FirstSwingDemo1 implements ActionListener{
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
public static void main(String args[]){
FirstSwingDemo1 f = new FirstSwingDemo1();
f.init(); }
6. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
305
void init(){
JFrame firstWindow = new JFrame("First Frame");
firstWindow.setSize(WIDTH , HEIGHT);
Container cn = new Container();
cn = firstWindow.getContentPane();
JButton endButton = new JButton("Click to end program");
cn.add(endButton);
endButton.addActionListener(this);
firstWindow.setVisible(true);
firstWindow.show();
}
public void actionPerformed(ActionEvent e){
System.out.println("test test");
System.exit(0);
}
}
ผลลัพธที่ได แสดงหนาจอดังนี้ เมื่อคลิกปุม Click to end program ก็จะแสดงขอความ test test ออกบน
หนาจอ out put แลวออกจากโปรแกรม
ตัวอยางโปรแกรมที่ประกอบดวย Button , Events , TextArea และ Swing basics อื่นๆ ประกอบกับการ
จัดการกับ event ดวย Action Listeners และ Action Events
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.Container;
7. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
306
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class testPanelEvent implements ActionListener{
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
private JFrame jfrm;
private Container contentPane;
private JButton btn1 , btn2 , btn3;
private JPanel pan , panColor ;
private JPanel pnMagenta, pnCyan , pnOrange;
public static void main(String args[]){
testPanelEvent blf = new testPanelEvent();
blf.init();
}
void init(){
jfrm = new JFrame("test grid layout");
jfrm.setSize(WIDTH,HEIGHT);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = jfrm.getContentPane();
contentPane.setLayout(new BorderLayout());
pan = new JPanel();
pnMagenta = new JPanel();
pnCyan = new JPanel();
pnOrange = new JPanel();
panColor = new JPanel();
pan.setLayout(new GridLayout(1,3));
panColor.setLayout(new GridLayout(1,3));
btn1 = new JButton("Magenta");
8. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
307
pan.add(btn1);
btn1.addActionListener(this);
btn2 = new JButton("Cyan");
pan.add(btn2);
btn2.addActionListener(this);
btn3 = new JButton("Orange");
pan.add(btn3);
pnMagenta.setBackground(Color.MAGENTA);
pnCyan.setBackground(Color.CYAN);
pnOrange.setBackground(Color.ORANGE);
panColor.add(pnMagenta);
panColor.add(pnCyan);
panColor.add(pnOrange);
contentPane.add(panColor , BorderLayout.CENTER);
contentPane.add(pan , BorderLayout.SOUTH);
contentPane.setVisible(true);
jfrm.show();
}
public void actionPerformed(ActionEvent e){
String buttonString = e.getActionCommand();
if(buttonString.equals("Magenta")){
System.out.println("Magenta click");
}
else if (buttonString.equals("Cyan")){
System.out.println("Cyan Click");
}
else if (buttonString.equals("Orange ")){
System.out.println("Orange Click");
}
}
}
9. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
308
ผลลัพธที่ไดแสดงดังภาพ เมื่อคลิก ปุม Magenta แสดงขอความ “Magenta click” บนหนาจอ
output และถาคลิกปุม Cyan แสดงขอความ “Cyan click” และถาคลิกปุม Orange จะแสดงขอความ
“Orange Click” บนหนาจอ output เชนกัน
ตัวอยางโปรแกรมที่ประกอบดวย Button , Events , TextArea และ Swing basics อื่นๆ ประกอบกับการ
จัดการกับ event ดวย Action Listeners และ Action Events
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
public class testMenuBar implements ActionListener{
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
private JFrame jfrm;
private Container contentPane;
private JPanel pan , panColor ;
private JPanel pnMagenta, pnCyan , pnOrange;
private JMenu colorMenu;
10. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
309
private JMenuItem pinkChoice , yellowChoice ,orangeChoice ;
private JMenuBar bar;
public static void main(String args[]){
testMenuBar blf = new testMenuBar();
blf.init(); }
void init(){
jfrm = new JFrame("test grid layout");
jfrm.setSize(WIDTH,HEIGHT);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = jfrm.getContentPane();
contentPane.setLayout(new BorderLayout());
pnMagenta = new JPanel();
pnCyan = new JPanel();
pnOrange = new JPanel();
panColor = new JPanel();
colorMenu = new JMenu("Add color");
panColor.setLayout(new GridLayout(1,3));
pinkChoice = new JMenuItem("Pink");
colorMenu.add(pinkChoice);
pinkChoice.addActionListener(this);
yellowChoice = new JMenuItem("Cyan");
colorMenu.add(yellowChoice);
yellowChoice.addActionListener(this);
orangeChoice = new JMenuItem("Orange");
colorMenu.add(orangeChoice);
orangeChoice.addActionListener(this);
bar = new JMenuBar();
bar.add(colorMenu);
jfrm.setJMenuBar(bar);
panColor.add(pnMagenta);
panColor.add(pnCyan);
11. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
310
panColor.add(pnOrange);
contentPane.add(panColor , BorderLayout.CENTER);
contentPane.setVisible(true);
jfrm.show();
}
public void actionPerformed(ActionEvent e){
String buttonString = e.getActionCommand();
if(buttonString.equals("Pink")){
pnMagenta.setBackground(Color.PINK);
}
else if (buttonString.equals("Cyan")){
pnCyan.setBackground(Color.CYAN);
}
else if (buttonString.equals("Orange")){
pnOrange.setBackground(Color.ORANGE);
}
}
}
ผลลัพธที่ได
12. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
311
ตัวอยางโปรแกรมที่ประกอบดวย Text Fields and Text Areas และ Swing basics อื่นๆ ประกอบกับการ
จัดการกับ event ดวย Action Listeners และ Action Events
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class testText implements ActionListener{
public static final int WIDTH = 300; public static final int HEIGHT = 200;
public static final int NUMBER_OF_CHAR = 20;
private JFrame jfrm;
private JPanel panel , buttonPanel;
private Container contentPane;
private JTextField fnametxt ;
private JLabel fnamelbl;
private JButton exitBtn , printBtn;
public static void main(String args[]){
testText blf = new testText();
blf.init();
}
void init(){
jfrm = new JFrame("Test Text Field");
jfrm.setSize(WIDTH,HEIGHT);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
312
contentPane = jfrm.getContentPane();
contentPane.setLayout(new BorderLayout());
panel = new JPanel();
panel.setLayout(new GridLayout(1,2));
buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
fnametxt = new JTextField (NUMBER_OF_CHAR);
fnamelbl = new JLabel("Name");
fnametxt.addActionListener(this);
panel.add(fnamelbl);
panel.add(fnametxt);
exitBtn = new JButton("Exit");
exitBtn.addActionListener(this);
printBtn = new JButton("Print");
printBtn.addActionListener(this);
buttonPanel.add(printBtn);
buttonPanel.add(exitBtn);
contentPane.add(panel , BorderLayout.CENTER);
contentPane.add(buttonPanel, BorderLayout.SOUTH);
contentPane.setVisible(true);
jfrm.pack();
jfrm.show();
}
public void actionPerformed(ActionEvent e){
System.out.println("Hello !!!" + fnametxt.getText());
}
}
ผลลัพธที่ได
เมื่อคลิกปุม print จะแสดงขอความ Hello!!! Surangkana เมื่อคลิกปุม Exit ออกจากโปรแกรม
14. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
313
แบบฝกหัด
1) จากแบบฝกหัดในบทที่ 12 ขอที่ 1 ใหทําการสรางหนาจอดังนี้
เขียนโปรแกรมทําการดักจับเหตุการณที่จะเกิดกับปุม “Magenta” คือถาคลิกปุมนี้แลวแถบดานบนจะ
ปรากฎสีมวง ถาคลิกปุม “Cyan” แลวจะปรากฎสีฟาบนพื้นที่ดานบนของปุม และถาคลิกปุม “Orange”
จะปรากฎสีสมดานบนของปุม เมื่อคลิกไอคอน X ทําการปดโปรแกรม
2 ) ใหนิสิตสรางโปรแกรมเพื่อทําการรับคา First name และ Last name เมื่อทําการคลิกปุม Print แสดง
ขอความ “Hello!! ชื่อ นามสกุล” คลิกปุม Clear ทําการลบขอความใน textbox ทั้งหมด กดปุน Exit
ออกจากโปรแกรม ดังตัวอยางตอไปนี้
3) จากตัวอยางบทที่ 12 คลาส JTextFieldArea แสดงหนาจอดังนี้
CCLLIICCKK
15. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
314
ใหนิสิตกําหนด action ใหกับปุมตางๆ ดังนี้
- ปุม Total ทําการ นําขอความใน Text 1 เชื่อมกับขอความใน Text 2 แสดงในชอง Total
- ปุม Clear ทําใหชองขอความทุกชองในหนาจอเปนชองวาง
- ปุม Exit เมื่อคลิกแลวทําใหปดโปรแกรม
4) สรางคลาสชื่อ FirstGUI แลวทําการเพิ่มปุมการทํางานใน JFrame เมื่อคลิกปุมดังกลาวจะปรากฎ
ขอความ “Modified First Window”. ในสวน title bar ของ window หากคลิกปุมนี้อีกครั้ง
ขอความจะเปลี่ยนเปน “Modified Again” และหากคลิกอีกครั้งจะกลับเปนขอความ “Modified
First Window” สลับกัน
5) สราง Window เพื่อทําการรับคา User name และ Password เมื่อคลิกปุม login จะปรากฎ messagebox
แสดงขอความ “Account successfully create” แลวตามดวย user และ password ที่รับคาไป แสดง
ดังรูป
6) ใหนิสิตเขียนโปรแกรมเพื่อคํานวณการรักษาฟน ประกอบดวย 3 รายการ ดังหนาจอตอไปนี้
JCheckBox
components
(unchecked)
16. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
315
หากไมไดกรอกชื่อหรือไมเลือกวิธีการรักษา แลวคลิกปุม calculate จะปรากฎหนาจอ เตือนดังรูป
หากคลิกปุม Ok จะเขามายังหนาจอเดิม ใหกรอกชื่อและทําการเลือกวิธีรักษา เมื่อคลิกปุม Calculate
จะแสดงผลรวมของการรักษาดังรูป
แตหากไมกรอกชื่อ Patient Name เมื่อคลิกปุม Calculate จะคํานวณ แลวแสดง message box ดังรูป
Message dialog Click OK JButton to close the
dialog
JCheckBox
components
(checked)
Close button
Dialog sized to
accommodate contents
Title bar
Icon indicates the tone
of the message
OK JButton allows user to
close the dialog
17. บทที่ 13 การจัดการกับอีเวนต หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
316
7) ใหนิสิตเขียนโปรแกรมดังหนาจอตอไปนี้
- เมื่อเลือกประเทศ ที่เปนคําตอบจาก JComboBox
- สงคําตอบที่ถูกโดยคลิกปุม Submit จะแสดงขอความ Correct ใน JLabel ดานลาง
- เมื่อคลิกปุม Next Flag
JComboBox contains
answers (country names)
JLabel แสดงรูปธง
คําตอบที่ถูกเลือก
Submit JButton
สามารถกลับมาใชไดใหม
JComboBox ของ
dropdownlistbox
เมื่อตอบถูกแสดงขอความ Correct!
JTextField ถูก clear