More Related Content Similar to บทที่ 12 กราฟฟิก
Similar to บทที่ 12 กราฟฟิก (17) More from Theeravaj Tum (20) บทที่ 12 กราฟฟิก1. หนาจอแสดงผลแบบกราฟฟก
Graphic User Interface
วัตถุประสงค
♦ เพื่อเรียนรูถึงสรางหนาจอการใชโปรแกรมแบบ Graphic ดวยหลักการของภาษาเชิงวัตถุ
♦ เพื่อเรียนรูหลักการของ Event-Driven Programming
♦ เพื่อศึกษาการเรียกใชงานคลาสที่เปนสวนประกอบของวินโดวดวยภาษาเชิงวัตถุ
♦ เพื่อศึกษาการเรียกใชงานวัตถุจาก awt และ java.swing
♦ เพื่อศึกษาการวางวัตถุบนคอนเทนเนอร
บทที่
12
2. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
271
เนื้อหาบทเรียน
♦ Graphic user interface
♦ คลาสในแพ็คเก็จ java.awt
♦ Container
♦ Window
♦ Frame
♦ Dialog
♦ Button
♦ Color
♦ TextComponent
♦ การจัดการวางวัตถุ(Containers and Layout Managers)
♦ FlowLayout
♦ BorderLayout
♦ GridLayout
♦ คลาสในแพ็คเก็จ javax.swing
♦ JFrame
♦ JButton
♦ JPanel
♦ JText Fields
♦ JText Areas
♦ JMenu and JMenuItem
3. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
272
Graphic User Interface(GUI )
ในบทนี้จะทําการศึกษาเกี่ยวกับการสรางหนาจอที่รองรับการทํางานแบบกราฟฟก(Graphic User
Interface:GUI) โดยนําคลาสที่มีอยูแลวในจาวาแพ็คเก็จมาใชงาน ไดแก คลาสที่อยูในแพ็คเก็จ
AWT(Abstract Window Toolkit) และ คลาสที่อยูในแพ็คเก็จ Swing ซึ่งจะทําใหผูเรียนเขาใจการใชงาน
คลาสที่นํามาใชสรางหนาจอการของโปรแกรมที่สรางใหอยูในรูปแบบกราฟฟก
คลาส awt เปนแพ็คเก็จที่ใชสราง windows การที่เราจะเรียกใชงานคลาส awt ไดนั้น เราจะตอง
อิมพอรตแพ็กเกจ java.awt ไวในโปรแกรมดวย เนื่องจาก GUI component ตางๆ ที่สรางขึ้นจะเปน
คลาสที่สืบทอดคุณสมบัติจาก คลาส Component หรือคลาส MenuComponent คลาสใดคลาสหนึ่งเสมอ
ดังรูปที่นํามาจาก Help file ของภาษาจาวาดังนี้
ตัวอยาง class ใน AWT:Abstract Window Toolkit
จากภาพ คลาส Container , Checkbox และ Button เปนตัวอยางของคลาสที่เปน GUI
component ซึ่งทุกคลาสเปน sub class ของคลาส component ที่เกี่ยวของ
Sub Class ของ
คลาส Container
4. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
273
จากภาพ คลาส TextComponent , TextArea, TextField เปนอีกตัวอยางหนึ่งของซับคลาส GUI
component สวนคลาส TextArea และ คลาส TextField เปนซับคลาสของคลาส TextComponent และ
คลาส TextComponent จะเปนคลาสซับของคลาส Component
หากตองการทราบวาในการเขียนโปรแกรมภาษาจาวานั้นมี GUI component อะไรใหเรียกใชได
บาง ใหดูไดจาก Document ที่ดาวนโหลดจากเว็บไซดของ ซัน หรือดูไดจาก Java Document online ใน
เว็บไซด http://java.sun.com/j2se/1.5.0/docs/
คลาสในแพ็คเก็จ java.awt
จาวาไดเตรียมคลาสสําหรับการสรางโปรแกรมเพื่อรองรับการทํางานแบบ GUI ไวในแพ็คเก็จชื่อ
java.awt ตัวอยางเชน คลาส Frame, Button , Label หรือ TextComponet ซึ่งคลาสเหลานี้จัดไดวาเปน
GUI component พื้นฐาน และสามารถนําหลักการสราง GUI ใน java application นี้ไปใชในการสราง
GUI component ใน java appletไดเชนกัน รูปตอไปนี้เปนตัวอยางคลาสที่มีในแพ็คเก็ต java.awt จากคูมือ
โปรแกรม Java PlatformStandard Edition 6
5. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
274
คลาส Container
Container คือ สวนที่ใชสําหรับวาง GUI component ตางๆ โดยเรียกใชเมธอด add ของคลาส
Container ซึ่งหากพิจารณาจากเอกสารการเขียนโปรแกรมของภาษาจาวา(Document) ดังรูปหนากอนนี้
จะพบวาคลาส Container มีคลาสลูกมากมาย แตที่นิยมเรียกใชบอยๆ ไดแก คลาส Window และ Panel
คลาส Window
ตัวอยาง การเรียกใชงานคลาส Window
import java.awt.Window; // ทําการ import class Window
import java.awt.Frame; // ทําการ import class Frame
class TestWindow {
public static void main(String[] args) {
Window wd = new Window(new Frame());
// สราง instance ของคลาส Window โดยเรียก constructor สงผานออบเจ็คของ Frame
wd.setSize(200,100); // ทําการกําหนดขนาดของ window
wd.setVisible(true); // แสดง window ตามขนาดที่กําหนดไว
}
}
ผลลัพธที่ได
คลาส Frame
คลาส Frame เปนซับคลาสของคลาส Window
ตัวอยาง การเรียกใชงานคลาส Frame
import java.awt.Frame;
class TestFrame{
public static void main(String[] args) {
Frame f = new Frame("First Frame");//1
f.setSize(300,200);//2
f.setVisible(true);//3
}
}
6. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
275
ผลลัพธที่ไดคือ
บรรทัดที่ 1 ทําการสราง instance ของออบเจ็ค Frame ซึ่งเปนวินโดวที่มี title bar และปุมสําหรับ
ยอ/ขยาย/ปด โดยกําหนดสวนของ title วา “First Frame” ดังรูป โปรแกรมนี้จะสิ้นสุดเมื่อกด Ctrl+C
บนคําสั่ง Dos และหากใชโปรแกรม edit plus ในระบบ Window ใหกดปุม Ctrl+Alt+Del จะปรากฎ
Window Task Manager ขึ้น ใหคลิกไปที่แถบ Process แลวเลือก image name ที่ java.exe แลวคลิกปุม
End Process ดังรูปตอไปนี้ เนื่องจากหากตองคลิกปุมปด(X) บนหนาจอ Window เพื่อปดหนาจอ
จะตองศึกษาเรื่อง Event handling ในบทที่ 14 กอน
คลาส Dialog
คลาส Dialog เปนซับคลาสของคลาส Window
บริเวณนี้เรียกวา Frame
7. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
276
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Label;
class TestDialog{
public static void main(String[] args) {
Frame f = new Frame("Second Frame");//1
Dialog d = new Dialog(f,"First Dialog");//2
Label lb = new Label("Hello java.awt.*");//3
d.add(lb);//4
d.pack();//5
f.setSize(200,100);//6
f.setVisible(true);//7
d.setVisible(true);//8
}
}
ผลลัพธที่ไดคือ
กอนทําการประกาศคลาสใหทําการ import คลาส Dialog, Frame และ Label เพื่อนํามาใชงาน
ภายในคลาส บรรทัดที่ 1 ทําการสราง Frame
บรรทัดที่ 2 ทําการสราง Dialog โดยกําหนดให Dialog นี้สงคา instance ของ f ไปและ
ทําการแสดงขอความบน Dialog วา “First Dialog”
บรรทัดที่ 3 ทําการสรางอินสแตนทของ Lable โดยกําหนดชื่อวา lb และ label นี้มี
ขอความ “Hello java.awt.*”
บรรทัดที่ 4 เรียกใช method add ของ Dialog เพื่อวาง label ลงบน Dialog Box
บรรทัดที่ 5 เรียกใช method pack ของคลาส Dialog จะทําการคํานวณและปรับขนาด
พื้นที่แสดงผลที่เหมาะสมใหกับไดอะล็อกบ็อกซโดยอัตโนมัติ โดยพิจารณาจากคอมโพเนนท
ตางๆ ที่นํามาวางบน Dialog box
บรรทัดที่ 6 การกําหนดขนาดของ Frame
บรรทัดที่ 7 กําหนดใหแสดง Frame บรรทัดที่ 8 กําหนดใหแสดง Dialog box
บริเวณนี้เรียกวา Dialog Box
8. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
277
คลาส Button
คลาส Button เปนซับคลาสของคลาส Component ใชสําหรับรองรับคําสั่งตางๆ ผานทาง
หนาจอโดยมีโครงสรางของ Constructor และ method ของคลาส ดังรูปที่นํามาจาก
http://java.sun.com/j2se/1.5.0/docs/
ตัวอยาง การสรางปุมคําสั่ง Button
import java.awt.Frame;
import java.awt.Button;
class TestButton{
public static void main(String[] args) {
Frame f = new Frame("First Frame");
Button b = new Button("Click");//1
f.add(b);//2
f.setSize(300,200);//3
f.setVisible(true); }}
9. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
278
ผลลัพธที่ไดคือ
กอนทําการประกาศคลาสใหทําการ import คลาส Frame และ Button ในแพ็คเก็จ java.awt เพื่อ
นํามาใชงานภายในคลาส จากโปรแกรม
บรรทัดที่ 1 ทําการสรางอินสแตนทของ Button b แสดงขอความ “Click” ปรากฎบนปุม
บรรทัดที่ 2 ทําการเพิ่มปุม b ลงใน Frame
บรรทัดที่ 3 ทําการกําหนดขนาดของ Frame
คลาส Color
The Color Constants จากคลาส Color ในแพ็คเก็จ java.awt
Color.BLACK Color.MAGENTA
Color.BLUE Color.ORANGE
Color.CYAN Color.PINK
Color.DARK_GRAY Color.RED
Color.GRAY Color.WHITE
Color.GREEN Color.WHILE
Color.LIGHT_GRAY Color.YELLOW
ตัวอยาง การเรียกใชงานคลาส Color กําหนดให Frame มีพื้นหลังเปนสีเหลือง
import java.awt.Frame;
import java.awt.Color;
import java.awt.Container;
public class ColoredWindowInitial {
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
Frame colorFrame ;
public static void main(String args[]) {
ColoredWindowInit cw = new ColoredWindowInit();
cw.init();
}
void init(){
colorFrame = new Frame("Color Frame");
colorFrame.setSize(WIDTH,HEIGHT);
10. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
279
colorFrame.setBackground(Color.YELLOW);//กําหนดใหพื้นหลังเปนสีเหลือง
colorFrame.show();
}
}
ผลลัพธที่ไดคือ
คลาส TextCompoment
โครงสรางคลาส TextComponent เปนคลาสที่ทํางานเกี่ยวกับการรับขอมูลทางหนาจอ คลาส
TextComponent ไดกําหนด method ที่สามารถทําใหการแกขอความเกิดขึ้นไดหรือไม และมี method
อื่นๆ ที่สามารถใชงานกับขอความใน java application ได โดยมี 2 ซับคลาสคือ TextArea สําหรับรับ
ขอความหลายบรรทัด และ TextField สําหรับรับขอความทีละหนึ่งบรรทัด
ตัวอยาง การเรียกใชงาน TextField
TextField tf1, tf2, tf3, tf4;
tf1 = new TextField(); // สราง instance TextField ใหเปนชองวาง
tf2 = new TextField("", 20); //กําหนดใหสราง TextField โดยรับตัวอักษร 20 ตัวอักษร
tf3 = new TextField("Hello!"); // สราง TextField โดยแสดงขอความ “Hello!” ใน TextField
tf4 = new TextField("Hello", 30); // สราง TextField โดยกําหนดใหแสดงขอความ “Hello”
ใน TextField ที่มีความกวาง 30 ตัวอักษร
11. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
280
ตัวอยาง การเรียกใชงาน TextArea
TextArea txtarea = new TextArea("Hello", 5, 40);
จากโคดโปรแกรมทําการ สราง TextArea กวาง 40 ตัวอักษร 5 บรรทัด และแสดงขอความ
“Hello” บนหนาจอ
ตัวอยาง การสรางปุมหลายๆ ปุมวางไวบนเฟรม
import java.awt.Frame;
import java.awt.Button;
class MultiButton{
public static void main(String[] args) {
Frame f = new Frame("First Frame");
Button b1 = new Button("Button 1");
Button b2 = new Button("Button 2");
Button b3 = new Button("Button 3");
f.add(b1);
f.add(b2);
f.add(b3);
f.setSize(300,200);
f.setVisible(true);
}
}
ผลลัพธที่ได จะแสดงเฉพาะ Button3 ดังรูป เนื่องจากโปรแกรมนี้ยังไมไดจัดการวาง layout ซึ่งจะ
ศึกษาในหัวขอถัดไป
12. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
281
การจัดการวางวัตถุ(Containers and Layout Managers)
ในตอนนี้จะบรรยายเกี่ยวกับการวางวัตถุบนหนาจอของภาษาจาวา(Layout manager) ซึ่งจาวาได
เตรียมคลาสตางๆ ไวใหกับผูเขียนโปรแกรมไดเรียกใชงาน ซึ่งทําใหวินโดวที่สรางสามารถยอ ขยาย
เคลื่อนยาย เลยเอาทของวินโดวที่สรางได
จากตัวอยางการเรียกใชคลาสตางๆ java.awt เมื่อทําการสรางออบเจ็คหลายๆ ออบเจ็ค และทํา
การเพิ่มเขาไปใน เฟรม หรือ วินโดว จะเกิดการซอนทับกันไมวาจะสรางกี่ออบเจ็คก็ตาม นั่นเปน
เพราะวาวินโดว หรือเฟรมเหลานั้น ยังไมไดทําการจัดการกับเลยเอาท ดังนั้นกอนที่จะวางวัตถุตางๆ
บนเฟรมหรือวินโดวจะตองทําการจัดการกับเลยเอาทกอน
จาวาไดเตรียมคลาสสําหรับจัดการกับเลยเอาทในเวอรชัน 1.6.0 ไวหลายรูปแบบทั้งที่อยูในแพ็ค
เก็จ java.awt และอยูใน javax.swing(ซึ่งตอไปเราจะศึกษาในเรื่องของคลาสที่อยูใน แพ็คเก็จ swing กัน)
เชน BorderLayout ,BoxLayout ,CardLayout ,FlowLayout ,GridBagLayout ,GridLayout ,GroupLayout,
SpringLayout เปนตน ในที่นี้จะขอกลาวเพียงบางรูปแบบ หากนิสิตตองการศึกษาเพิ่มเติม สามารถหา
ขอมูลไดที่ http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html
1. การวางวัตถุแบบโฟลเลยเอาท(FlowLayout)
การจัดการวาง layout แบบ FlowLayout เปนการจัดการ layout อยางงาย เมื่อเรียกใชอินสแตนท
ของ Flowlayout ทําการจัดวาง components จากซายไปขวา หรือจากบนลงลางตามลําดับ
กําหนดให frame หรือ container จัดวางตัวแบบ FlowLayout โดยเรียกใชเมธอด setLayout();
เชน frm.setLayout(new FlowLayout());
contentPane.setLayout(new FlowLayout());
ตัวอยาง การเรียกใชงาน FlowLayout เพื่อกําหนดการวาง Layout ใหกับปุม Button
import java.awt.FlowLayout;
import java.awt.Button;
import java.awt.Frame;
public class testFlowLayoutAwt{
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
private Frame frm;
private Button btn1 , btn2 , btn3;
public static void main(String args[]){
testFlowLayoutAwt blf = new testFlowLayoutAwt();
13. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
282
blf.init();
}
void init(){
frm = new Frame("test border layout");
frm.setSize(WIDTH,HEIGHT);
frm.setLayout(new FlowLayout());
btn1 = new Button("First Label");
btn2 = new Button("Second Label");
btn3 = new Button("Third Label");
frm.add(btn1);
frm.add(btn2);
frm.add(btn3);
frm.setVisible(true);
frm.show();
}
}
ผลลัพธที่ได แสดงดังรูปทางดานลาง
หากทําการยอหรือขยายขนาดของวินโดวจะแสดงดังรูปตอไป
14. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
283
2. การวางวัตถุแบบบอรเดอรเลยเอาท(BorderLayout)
BorderLayout เปนวิธีการจัดการวาง components ตางๆ ใน content pane ของ JFrame หรือ
จัดการวางวัตถุบน Frame หรือ Window แบงเปน 5 บริเวณ โดยแบงตามทิศทาง ไดแก ทิศเหนือ ทิศใต
ทิศตะวันออก ทิศตะวันตก และตรงกลาง โดยแตละบริเวณมีชื่อเรียกดังภาพ
ตัวอยาง การวางวัตถุบน content pane ในการวางแบบ BorderLayout
contentPane.setLayout(new BorderLayout());
frm.setLayout(new BorderLayout());
ตัวอยาง การวาง button แบบ BorderLayout
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
public class testBorderLayoutAwt{
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
private Frame frm;
private Button btn1 , btn2 , btn3 , btn4;
public static void main(String args[]){
testBorderLayoutAwt blf = new testBorderLayoutAwt();
blf.init();
}
void init(){
frm = new Frame("Border layout");
frm.setSize(WIDTH,HEIGHT);
frm.setLayout(new BorderLayout()); // กําหนดใหเฟรมมีการจัดวางแบบ BorderLayout
btn1 = new Button("First Button");
btn2 = new Button("Second Button");
btn3 = new Button("Third Button");
btn4 = new Button("Fourth Button");
frm.add(btn1,BorderLayout.NORTH);// ปุม btn1 วางทิศเหนือ
15. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
284
frm.add(btn2,BorderLayout.SOUTH);// ปุม btn2 วาง ทิศใต
frm.add(btn3,BorderLayout.EAST);// ปุม btn3 วางทิศตะวันออก
frm.add(btn4,BorderLayout.WEST); // ปุม btn4 วางทิศตะวันตก
frm.setVisible(true);
frm.show();
}
}
ผลลัพธที่ไดแสดงดังนี้
3. การวางวัตถุแบบกริดเลยเอาท(GridLayout)
การจัดวาง components แบบ GridLayout เปนการจัดวางวัตถุในลักษณะสองมิติ โดยระบุขนาด
ของ row และ column เชน
Container.setLayout(new GridLayout(2, 3));
- ทุกๆ entry จะไดขนาดเทากัน โดยไมแสดงเสน grid ของขอบ
- แตละ componet นํามาวางไวใน grid ตามลําดับการ add โดยวางตาม row เปนหลัก
- แตละ component จะถูกทําใหมีขนาดเทากับ grid
ตัวอยาง การวางปุม button แบบ gridLayout
import java.awt.GridLayout;
import java.awt.Button;
import java.awt.Frame;
public class testGridLayoutAwt{
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
private Frame frm;
private Button btn1 , btn2 , btn3 , btn4;
16. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
285
public static void main(String args[]){
testGridLayoutAwt blf = new testGridLayoutAwt();
blf.init();
}
void init(){
frm = new Frame("Border layout");
frm.setSize(WIDTH,HEIGHT);
frm.setLayout(new GridLayout(2,4));
btn1 = new Button("First Button");
btn2 = new Button("Second Button");
btn3 = new Button("Third Button");
btn4 = new Button("Fourth Button");
frm.add(btn1);
frm.add(btn2);
frm.add(btn3);
frm.add(btn4);
frm.setVisible(true);
frm.show();
}
}
ผลลัพธที่ไดคือ
17. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
286
คลาสในแพ็คเก็จ javax.swing
ใน java.swing ประกอบดวย GUI component จํานวนมากที่ใชสําหรับการสราง GUI
เชนเดียวกับคลาสตางใน java.awt คลาสใน javax.swing สืบทอดมาจากคลาส container ในแพ็คเก็ต
java.awt ดังนั้นหากตองการใชงานคลาสตางๆ ในแพ็คเก็ตนี้ตองทําการอิมพอรต javax.swing ไวใน
โปรแกรมดวย
สังเกตวาคลาสในแพ็คเก็จ javax.swing จะขึ้นตนดวยตัว J เชน JLabel, JButton ,JFrame เปน
ตน เหตุที่จาวาสรางคลาสตางๆ ใน javax.swing เนื่องจากคลาสใน java.awt เมื่อเรียกใชงานตาง plant
form แลวบาง component ไมเหมือนกับที่รันในอีก plant form หนึ่ง กลาวคือ สรางโปรแกรมบน
windows แลวนําไปรันบนระบบปฏิบัติการ linux แลวเกิดการผิดเพี้ยนในรูปแบบที่นําเสนอ ดังนั้น ทาง
ทีมพัฒนาจึงสรางคลาสใน javax.swing ขึ้นมาใชงานและเพิ่มความสามารถที่ซับซอนกวาคลาสที่มีใน
java.awt ใหกับคลาสตางๆ ใน javax.swing
หลักการทํางานของคลาสตางๆ ใน javax.swing ประกอบดวย 2 component หลักคือ top-level
container และ lightweight component
- top level container ประกอบดวยคอมโพเนนต 4 ตัวคือ JFrame , JApplet , JWindow และ
JDialog
- lightweight component เปนคอมโพเนนตอื่นๆ ของ javax.swing ที่ไมไดอยูในกลุม top
level container
โดยทั่วไป top level container สรางขึ้นเพื่อใชสําหรับวาง lightweight component ลงไปบนตัว
มัน แตอยางไรก็ตามเราไมสามารรถวาง component ลงบน top levelโดยตรง เราตองวาง component
เหลานั้นผานทาง content pane (ออบเจ็คของคลาส Container) ภายใน top level อีกทีหนึ่ง ซึ่งเรา
สามารถเขาถึง content pane ภายใน top level container หนึ่งๆ ไดโดยเรียกใชเมธอด getContentPane
ของ top level container นั้นๆ
18. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
287
คลาส JFrame
ตัวอยาง โปรแกรมการเรียกใชงาน JFrame
import javax.swing.JFrame;
class TestFrame{
public static void main(String[] args) {
JFrame f = new JFrame("First JFrame");// 1
f.setSize(300,200);//2
f.setVisible(true);//3
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//4
}
}
ผลลัพธที่ไดคือ
บรรทัดที่ 1 สรางอินสแตนทชื่อ f เปนออบเจ็คของคลาส JFrame กําหนดให title bar แสดง
ขอความ First JFrame
บรรทัดที่ 2 กําหนดขนาดของเฟรม กวาง 300 พิกเซลล สูง 200 พิกเซลล
บรรทัดที่ 3 กําหนดใหแสดงเฟรมนี้บนหนาจอ
บรรทัดที่ 4 หากทําการคลิกปุม (X) จะทําการปดหนาจอเฟรมนี้
คลาส JButton
ตัวอยาง โปรแกรมการเรียกใชงาน JButton , JFrame , Container เปนโปรแกรมที่แสดงวินโดวโดย
เรียกใชคลาส JFrame มาแสดง สวนของไตเติลของเฟรมแสดงขอความ “First Frame” และปรากฎปุม
ที่มีขอความ “Click to end program” แตไมสามารถกระทําการใดๆ กับวินโดวนี้ได ดังรูป
19. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
288
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Container;
public class FirstSwingDemo {
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
public static void main(String args[]){
JFrame firstWindow = new JFrame("First Frame");
Container contentPane = new Container();
// ตองทําการสราง container เพื่อเพิ่ม component ใน lightweight component บน top level component
firstWindow.setSize(WIDTH , HEIGHT);
// กําหนดขนาดของ Window
firstWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//ทําให window นี้ปดเมื่อคลิกที่ปุม close (X) ของ window
JButton endButton = new JButton("Click to end program");
contentPane = firstWindow.getContentPane();
//กําหนดให contentPane เขาถึง content pane ภายในอินสแตนทของ firstWindow ได
contentPane.add(endButton);
//ทําการเพิ่มปุม endButton เขาไปใน contentPane
firstWindow.setVisible(true);
firstWindow.show();
}
}
ตัวอยาง การเรียกใชงาน FlowLayout , JFrame , JButton
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.FlowLayout;
public class testFlowLayout {
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
20. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
289
private JFrame jfrm;
private Container contentPane;
private JButton btn1 , btn2 , btn3;
public static void main(String args[]){
testFlowLayout blf = new testFlowLayout();
blf.init();
}
void init(){
jfrm = new JFrame("test border layout");
jfrm.setSize(WIDTH,HEIGHT);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = jfrm.getContentPane();
contentPane.setLayout(new FlowLayout());
btn1 = new JButton("First Label");
contentPane.add(btn1);
btn2 = new JButton("Second Label");
contentPane.add(btn2);
btn3 = new JButton("Third Label");
contentPane.add(btn3);
contentPane.setVisible(true);
jfrm.show();
}
}
21. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
290
ตัวอยาง การเรียกใชงาน Borderlayout, JFrame , JButton
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Container;
import java.awt.BorderLayout;
public class testBorder {
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
private JFrame jfrm;
private Container contentPane;
private JLabel lbl1 , lbl2 , lbl3;
public static void main(String args[]){
testBorder blf = new testBorder();
blf.init();
}
void init(){
jfrm = new JFrame("test border layout");
jfrm.setSize(WIDTH,HEIGHT);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = jfrm.getContentPane();
contentPane.setLayout(new BorderLayout());
lbl1 = new JLabel("First Label");
contentPane.add(lbl1 , BorderLayout.NORTH);
lbl2 = new JLabel("Second Label");
contentPane.add(lbl2, BorderLayout.SOUTH);
lbl3 = new JLabel("Third Label");
contentPane.add(lbl3, BorderLayout.CENTER);
contentPane.setVisible(true);
jfrm.show();
}
}
ผลลัพธที่ได
22. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
291
contentPane.setLayout(new GridLayout( 2,4)); contentPane.setLayout(new GridLayout( 4,4));
ตัวอยาง การเรียกใชงาน Gridlayout , JFrame , JButton
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.GridLayout;
public class testGirdLayout {
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
private JFrame jfrm;
private Container contentPane;
private JButton btn1 , btn2 , btn3;
public static void main(String args[]){
testGirdLayout blf = new testGirdLayout();
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 GridLayout( 4,4));
btn1 = new JButton("First Label");
contentPane.add(btn1);
btn2 = new JButton("Second Label");
contentPane.add(btn2);
btn3 = new JButton("Third Label");
contentPane.add(btn3);
contentPane.setVisible(true);
jfrm.show();
}
23. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
292
คลาส JPanel
JPanel เปน class ที่เปนเสมือน container ที่ใชในการรวมกลุมของ object เล็กๆ เปน component
ใหญ(หรือเรียกวาเปน panel) หนาที่หลักของ JPanel คือ ทําการแบงสวนของ JFrame หรือ container
ตัวอยาง การใชงาน JPanel ในการจัดการกับ Layout
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.BorderLayout;
public class testPanel {
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;
public static void main(String args[]){
testPanel blf = new testPanel();
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();
pan.setLayout(new GridLayout(1,3));
btn1 = new JButton("Magenta");
pan.add(btn1);
btn2 = new JButton("Cyan");
pan.add(btn2);
btn3 = new JButton("Orange");
pan.add(btn3);
contentPane.add( pan , BorderLayout.SOUTH);
contentPane.setVisible(true);
jfrm.show(); }}
24. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
293
ผลลัพธที่ไดคือ
ตัวอยาง การเรียกใชงาน JLabel
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Color;
import java.awt.Container;
class ColoredWindow extends JFrame{
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
public ColoredWindow(Color theColor){
super("No Charge for Color");
setSize(WIDTH , HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// โปรแกรมจะสิ้นสุดเมื่อ user คลิกปุม close
Container contentPane = getContentPane();
// The content pane is of type Container
contentPane.setBackground(theColor);
JLabel aLabel = new JLabel("Close-window button ");
contentPane.add(aLabel);
}
public ColoredWindow(){
this(Color.PINK);
//This is an invocation of the other constructor
}
}
public class DemoColoredWindow{
public static void main(String[] args) {
ColoredWindow w1 = new ColoredWindow();
w1.setVisible(true);
ColoredWindow w2 = new ColoredWindow(Color.YELLOW);
w2.setVisible(true);
}};
25. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
294
ผลลัพธที่ไดคือ จะปรากฎ 2 Frame ซอนกัน ตองนําเมาสลากแยกจากกัน window หนึ่งสีเหลือ อีกอันสี
ชมพู และเมื่อทําการคลิกปุมปด window จะปดพรอมกันทั้งคู ดังรูป
คลาส JText Field , JText Area
JTextField สําหรับรับขอความทีละ 1 บรรทัด
JTextArea สําหรับรับขอความทีละหลายบรรทัด
ตัวอยาง การใชงาน JTextField, JTextArea
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class JTextFieldandArea {
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
JFrame frm;
Container contentPane;
JTextField txtFirst , txtSecond;
JTextArea txtAns;
JLabel lblFirst,lblSecond, lblAns;
Container con;
JPanel pn1 , pn2, pn3;
JButton bn1,bn2,bn3;
public static void main(String args[]) {
JTextFieldandArea frmTxt = new JTextFieldandArea();
สามารถเขียนเปน
import javax.swing.*
26. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
295
frmTxt.init();
}
void init(){
frm = new JFrame("Input Text");
frm.setSize(WIDTH,HEIGHT);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
lblFirst = new JLabel("Text 1 :"); // กําหนด label มีขอความ Text 1:
lblSecond = new JLabel("Text 2 :"); // กําหนด label มีขอความ Text 2
lblAns = new JLabel("Total");// กําหนด label มีขอความ Total
txtFirst = new JTextField(20); // กําหนดให textfield มีขนาด 20 ตัวอักษร
txtSecond = new JTextField(20); // กําหนดให textfield มีขนาด 20 ตัวอักษร
txtAns = new JTextArea( 5, 20); // กําหนดให textArea มีขนาด 20 ตัวอักษร 5 บรรทัด
bn1 = new JButton("Total");// สรางปุมคําสั่ง แสดงขอความ Total
bn2 = new JButton("Clear");// สรางปุมคําสั่ง แสดงขอความ Clear
bn3 = new JButton("Exit");// สรางปุมคําสั่ง แสดงขอความ Exit
contentPane = frm.getContentPane();
// รับคา ContentPane ของ เฟรมหลักไวที่ Container
contentPane.setLayout(new BorderLayout( ));
// กําหนด Container วาง layout แบบ BorderLayout
pn1 = new JPanel();
pn1.setLayout(new GridLayout(2,2));
//สราง JPanel และกําหนดใหวางวัตถุแบบ GridLayout ขนาด 2x2
pn1.add(lblFirst);
pn1.add(txtFirst);
pn1.add(lblSecond);
pn1.add(txtSecond);
pn2 = new JPanel();
pn2.setLayout(new BorderLayout());
// สราง JPanel และกําหนดใหวางวัตถุแบบ BorderLayout
pn2.add(lblAns,BorderLayout.WEST);
pn2.add(txtAns,BorderLayout.CENTER);
pn3 = new JPanel();
pn3.setLayout(new FlowLayout());
//สราง JPanel และกําหนดใหวางวัตถุบน Panel นี้แบบ FlowLayout
pn3.add(bn1);
pn3.add(bn2);
pn3.add(bn3);
contentPane.add( pn1 , BorderLayout.NORTH);
//ทําการเพิ่ม JPanel ตัวแรกไวบน Container
27. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
296
contentPane.add(pn2,BorderLayout.CENTER);
//ทําการเพิ่ม JPanel ตัวที่สองไวบน Container
contentPane.add(pn3,BorderLayout.SOUTH);
//ทําการเพิ่ม JPanel ตัวที่สามไวบน Container
contentPane.setVisible(true);
frm.show();
}
}
ผลลัพธที่ไดคือ
คลาส JMenu and JMenuItem
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
public class JMenuBarItem {
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
private JFrame jfrm;
private Container contentPane;
private JMenu colorMenu;
private JMenuItem pinkChoice , yellowChoice ,orangeChoice ;
private JMenuBar bar;
เพื่อสราง menu bar ใหกับ window
28. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
297
public static void main(String args[]){
JMenuBarItem blf = new JMenuBarItem();
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());
colorMenu = new JMenu("Add color"); // สรางเมนูหลัก
pinkChoice = new JMenuItem("Pink"); // สรางเมนูยอยที่ 1
colorMenu.add(pinkChoice);// เพิ่มเมนูยอยที่ 1 เขาไปในเมนูหลัก
yellowChoice = new JMenuItem("Cyan");//สรางเมนูยอยที่ 2
colorMenu.add(yellowChoice); // เพิ่มเมนูยอยที่ 2 เขาไปในเมนูหลัก
colorMenu.addSeparator();// ใสเสนเพื่อแบงกลุมเมนู
orangeChoice = new JMenuItem("Orange");//สรางเมนูยอยที่ 3
colorMenu.add(orangeChoice); // เพิ่มเมนูยอยที่ 3 เขาไปในเมนูหลัก
bar = new JMenuBar();
bar.add(colorMenu); // เพิ่มเมนูหลักเขาไปใน JMenuBar ที่ชื่อ bar
jfrm.setJMenuBar(bar);// ทําการกําหนดให bar อยูใน frame ที่สรางไว
contentPane.setVisible(true); // แสดง container
jfrm.show();// แสดง frame
}
}
ผลลัพธที่ไดแสดงดังรูปซาย เมื่อคลิกที่เมนู Add Color จะปรากฎเมนูยอย Pink , Yellow และ Orange
ดังรูป
29. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
298
แบบฝกหัด
1 ใหเขียนโปรแกรมแสดงหนาจอดังนี้
2 ใหเขียนโปรแกรมแสดงหนาจอดังนี้
JPasswordField แสดงดอกจัน (*)
มื่อผูใชคียหนึ่งตัวอักษร
30. บทที่ 12 หนาจอแสดงผลแบบกราฟฟก หนาที่
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
299
3 ใหเขียนโปรแกรมแสดงหนาจอดังนี้
4 ใหเขียนโปรแกรมแสดงหนาจอดังนี้