บทที่ 6 gui ขั้นสูง และ applet advanced gui and...

26
บทที16 GUI ขั้นสูง และ Applet Advanced GUI and Applet ในบทนี้จะกล่าวถึงวิธีการใช้งาน JComponent ซึ่งมีความสามารถพิเศษ และมีรูปแบบที่สวยงานเป็นที่รู้จัก โดยทั่วไป ได้แกJOptionPane, JDesktopPane, JInternalFrame, JColorChooser และ JFileChooser ในส่วนสุดท้ายของบทนี้ กล่าวถึงการตั้งค่า Look and Feel และการสร้าง Applet หรือโปรแกรมที่ทางาน บน Web Browser JOptionPane JOptionPane ใช้ในการสร้าง Dialog ซึ่งเป็นหน้าต่างสาหรับแสดงข้อความหรือรับข้อมูลจากผู้ใช้งานและมี ปุ่ม “OK” เมื่อผู้ใช้งานกดปุ่ม “OK” จะส่งผลให้ Dialog ปิดลง วัตถุประสงค์ของการใช้ Dialog เพื่อแสดงข้อความ สั้นๆ หรือรับข้อมูลจานวนไม่มากจากผู้ใช้งาน Dialog แบ่งเป็น 2 ประเภท คือ 1. Modal Dialog ในช่วงเวลาทีDialog ทางานอยูWindows จะไม่สามารถใช้งานได้จนกระทั่ง ผู้ใช้งานปิด Dialog ลง ตัวอย่างของ Modal Dialog เช่น Dialog ของการเปิดแฟ้มข้อมูลของ โปรแกรม Microsoft Word ส่วนการสร้าง Modal Dialog ใช้คลาส JOptionPane 2. Non-modal Dialog ต่างจากประเภทแรกคือ ผู้ใช้งานสามารถใช้งาน Windows ได้ปกติแม้ว่า Non-modal Dialog จะถูกเปิดอยูการสร้าง Non-modal Dialog ทาได้โดยใช้คลาส JDialog ซึ่ง การสร้างใช้วิธีเดียวกับการสร้าง JFrame การแสดง Dialog โดยใช้คลาส JOptionPane จาเป็นต้องใช้ Static Method ซึ่งอยู่ในคลาส JOptionPane ดังนี JOptionPane.showConfirmDialog() เพื่อรอรับคายืนยันในการสั่งงานโดยมีปุ่ม “Yes” “No” หรือ “Cancel” JOptionPane.showInputDialog() เพื่อรับข้อมูลจากผู้ใช้งาน JOptionPane.showMessageDialog() เพื่อแสดงข้อความสั้นๆ JOptionPane.showOptionDialog() เป็น Method ที่อนุญาตให้มีการปรับแต่งการแสดง Dialog ตามทีผู้เขียนโปรแกรมต้องการได้ ค่าที่ส่งกลับจาก Method showConfirmDialog() เป็นค่าคงที่ของปุ่มที่ผู้ใช้งานกดเลือกเช่น OK_OPTION CANCEL_OPTION หรือ YES_OPTION ซึ่งทาให้ผู้เขียนโปรแกรมสามารถทราบว่าผู้ใช้งานกดปุ่มใด ตัวอย่าง รูปแบบการเรียกใช้งาน Method showConfirmDialog() มี 4 แบบคือ static int showConfirmDialog(Component parentComponent, Object message) static int showConfirmDialog(Component parentComponent, Object message, String title, int optionType)

Upload: others

Post on 31-Oct-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

บทท 16

GUI ขนสง และ Applet Advanced GUI and Applet ในบทนจะกลาวถงวธการใชงาน JComponent ซงมความสามารถพเศษ และมรปแบบทสวยงานเปนทรจกโดยทวไป ไดแก JOptionPane, JDesktopPane, JInternalFrame, JColorChooser และ JFileChooser

ในสวนสดทายของบทน กลาวถงการตงคา Look and Feel และการสราง Applet หรอโปรแกรมทท างานบน Web Browser JOptionPane JOptionPane ใชในการสราง Dialog ซงเปนหนาตางส าหรบแสดงขอความหรอรบขอมลจากผใชงานและมปม “OK” เมอผใชงานกดปม “OK” จะสงผลให Dialog ปดลง วตถประสงคของการใช Dialog เพอแสดงขอความสนๆ หรอรบขอมลจ านวนไมมากจากผใชงาน Dialog แบงเปน 2 ประเภท คอ

1. Modal Dialog ในชวงเวลาท Dialog ท างานอย Windows จะไมสามารถใชงานไดจนกระทงผใชงานปด Dialog ลง ตวอยางของ Modal Dialog เชน Dialog ของการเปดแฟมขอมลของโปรแกรม Microsoft Word สวนการสราง Modal Dialog ใชคลาส JOptionPane

2. Non-modal Dialog ตางจากประเภทแรกคอ ผใชงานสามารถใชงาน Windows ไดปกตแมวา Non-modal Dialog จะถกเปดอย การสราง Non-modal Dialog ท าไดโดยใชคลาส JDialog ซงการสรางใชวธเดยวกบการสราง JFrame

การแสดง Dialog โดยใชคลาส JOptionPane จ าเปนตองใช Static Method ซงอยในคลาส JOptionPane ดงน

JOptionPane.showConfirmDialog() เพอรอรบค ายนยนในการสงงานโดยมปม “Yes” “No” หรอ “Cancel” JOptionPane.showInputDialog() เพอรบขอมลจากผใชงาน JOptionPane.showMessageDialog() เพอแสดงขอความสนๆ JOptionPane.showOptionDialog() เปน Method ทอนญาตใหมการปรบแตงการแสดง Dialog ตามท

ผเขยนโปรแกรมตองการได

คาทสงกลบจาก Method showConfirmDialog() เปนคาคงทของปมทผใชงานกดเลอกเชน OK_OPTION CANCEL_OPTION หรอ YES_OPTION ซงท าใหผเขยนโปรแกรมสามารถทราบวาผใชงานกดปมใด ตวอยางรปแบบการเรยกใชงาน Method showConfirmDialog() ม 4 แบบคอ static int showConfirmDialog(Component parentComponent, Object message)

static int showConfirmDialog(Component parentComponent, Object message, String title,

int optionType)

Page 2: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

318 การเขยนโปรแกรมภาษา Java

static int showConfirmDialog(Component parentComponent, Object message, String title,

int optionType, int messageType)

static int showConfirmDialog(Component parentComponent, Object message, String title,

int optionType, int messageType, Icon icon)

สวน Parameter ทตองก าหนดเมอมการเรยกใช Method ทง 4 มดงน

ParentComponent ใชระบตวแปรของ JFrame โดย Dialog จะแสดงอยภายใต JFrame ทระบ ในกรณทโปรแกรมมการใช JFrame มากกวา 1 ถาใหตวแปร ParentComponent เปน null สงผลให Dialog แสดงภายใต JFrame หลก และอยตรงกลางจอภาพ

message เปนขอมลทตองการใหแสดงใน Dialog โดยทวไป message เปนชนด String หรอถาเปนวตถชนดอน Method toString() จะถกเรยกใชแทน ตวแปร message อาจเปน JLabel ไดอกดวย

title เปน String ทแสดงบน Title Bar ของ Dialog optionType เปนการระบชนดของจ านวนปมทตองการ

o DEFAULT_OPTION o YES_NO_OPTION o YES_NO_CANCEL_OPTION o OK_CANCEL_OPTION

messageType เปนการระบชนดของรปภาพทตองการใหแสดง o ERROR_MESSAGE o INFORMATION_MESSAGE o WARNING_MESSAGE o QUESTION_MESSAGE o PLAIN_MESSAGE

icon ผเขยนโปรแกรมสามารถก าหนดรปภาพทตองใหแสดงใน Dialog ไดเอง โปรแกรม ShowDialog1.java แสดงการใชงานค าสง showConfirmDialog() โดยกดปม Start เพอแสดง Confirm Dialog รปแบบตางๆ import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

import java.awt.event.*;

class MyFrame extends JFrame implements ActionListener{

public MyFrame(int width, int height) {

Toolkit tk = getToolkit();

Dimension screen = tk.getScreenSize();

setBounds( (screen.width - width)/2,

(screen.height - height)/2, width, height);

setDefaultCloseOperation(EXIT_ON_CLOSE);

JButton start = new JButton("Start");

start.addActionListener(this);

Page 3: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 319

getContentPane().setLayout(new FlowLayout());

getContentPane().add(start);

}

public void actionPerformed(ActionEvent e) {

JOptionPane.showConfirmDialog(this, "1. Are you sure to do this");

JOptionPane.showConfirmDialog(this,

"2. DEFAULT_OPTION AND ERROR_MESSAGE",

"Confirm Dialog",

JOptionPane.DEFAULT_OPTION,

JOptionPane.ERROR_MESSAGE);

JOptionPane.showConfirmDialog(this,

"3. YES_NO_OPTION AND INFORMATION_MESSAGE",

"Confirm Dialog",

JOptionPane.YES_NO_OPTION,

JOptionPane.INFORMATION_MESSAGE);

JOptionPane.showConfirmDialog(this,

"4. YES_NO_CANCEL_OPTION AND WARNING_MESSAGE",

"Confirm Dialog",

JOptionPane.YES_NO_CANCEL_OPTION,

JOptionPane.WARNING_MESSAGE);

JOptionPane.showConfirmDialog(this,

"5. OK_CANCEL_OPTION AND QUESTION_MESSAGE",

"Confirm Dialog",

JOptionPane.OK_CANCEL_OPTION,

JOptionPane.QUESTION_MESSAGE);

}

}

public class ShowDialog1 {

public static void main(String[] args) {

MyFrame frame = new MyFrame(200, 200);

frame.setTitle("Confirm Dialogs");

frame.setVisible(true);

}

}

ภาพท 16.1 แสดงตวอยาง Dialog จากโปรแกรม ShowDialog1.java ค าสง showInputDialog() ใชในการรบขอมลจากผใชงาน โดยคาทรบจะเปน String ซงผเขยนโปรแกรมสามารถใชค าสงใน Package java.lang เพอแปลง String ใหอยในรปแบบทตองการได เชน การเปลยน String เปน Integer โดยใชค าสง Integer.parseInt(String input) ได สวนค าสง showMessageDialog() มลกษณะคลาย

Page 4: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

320 การเขยนโปรแกรมภาษา Java

ค าสง showConfirmDialog() คอใชแสดงขอความสนๆ ใหผใชงานทราบ และไมมคาสงกลบจาก Method น ค าสง showMessageDialog() สามารถสงผาน Parameter ไดหลายรปแบบ แตคา Parameter มความคลายคลงกบ Parameter ในค าสง showConfirmDialog() จงไมกลาวซ าอก ผอานสามารถอานเพมเตมถงรปแบบการการสง Parameter ไดจาก Java API Documentation โปรแกรม ShowDialog2.java แสดงการรบขอมลจากผใชงานโดยใช showInputDialog() import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

import java.awt.event.*;

class MyFrame extends JFrame implements ActionListener{

public MyFrame(int width, int height) {

Toolkit tk = getToolkit();

Dimension screen = tk.getScreenSize();

setBounds( (screen.width - width)/2,

(screen.height - height)/2, width, height);

setDefaultCloseOperation(EXIT_ON_CLOSE);

JButton start = new JButton("Start Asking");

start.addActionListener(this);

getContentPane().setLayout(new FlowLayout());

getContentPane().add(start);

}

public void actionPerformed(ActionEvent e) {

String name = JOptionPane.showInputDialog(this,"What is your name?");

String old = JOptionPane.showInputDialog(this,"How old are you?");

int likeJava = JOptionPane.showConfirmDialog(this,

"Do you like study in Java?",

"Asking",

JOptionPane.YES_NO_OPTION,

JOptionPane.QUESTION_MESSAGE);

//ถาผปอนขอมลกดปม Cancle คาทสงกลบจะเปน null if(name != null)

JOptionPane.showMessageDialog(this, "You are " +name);

if(old != null)

JOptionPane.showMessageDialog(this, "You are " + old +

" years old");

if(likeJava == JOptionPane.OK_OPTION)

JOptionPane.showMessageDialog(this,

"You will be a good programmer in Java");

else JOptionPane.showMessageDialog(this,

"Are you kidding? Java is very easy to learn. You will like it");

}

}

public class ShowDialog2 {

public static void main(String[] args) {

MyFrame frame = new MyFrame(200,100);

frame.setTitle("Confirm Dialogs");

frame.setVisible(true);

}

}

Page 5: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 321

ภาพท 16.2 แสดงการใช Input Dialog จากโปรแกรม ShowDialog2.java

ค าสง showOptionDialog() เปดโอกาสใหผเขยนโปรแกรมสามารถสราง Custom Dialog ได โดยมค าสง

ดงตอไปน showOptionDialog ( Component parentComponent,

Object message,

String title,

int optionType,

int messageType,

Icon icon,

Object[] options,

Object initialValue )

คา Object[] option และ Object initialValue เปนการระบให Dialong แสดงปมเชน “Yes” หรอ “No” ตามตองการได โปรแกรม ShowDialog3.java แสดงวธใชงานค าสงของ showOptionDialog() import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

import java.awt.event.*;

class MyFrame extends JFrame implements ActionListener{

public MyFrame(int width, int height) {

Toolkit tk = getToolkit();

Dimension screen = tk.getScreenSize();

setBounds( (screen.width - width)/2,

(screen.height - height)/2, width, height);

setDefaultCloseOperation(EXIT_ON_CLOSE);

JButton start = new JButton("Start Option Dialog");

start.addActionListener(this);

getContentPane().setLayout(new FlowLayout());

getContentPane().add(start);

}

public void actionPerformed(ActionEvent e) {

Object[] options = { "OK", "CANCEL" };

JOptionPane.showOptionDialog(null,

"Choose one", "Warning",

JOptionPane.DEFAULT_OPTION,

JOptionPane.WARNING_MESSAGE,

null,

options,

Page 6: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

322 การเขยนโปรแกรมภาษา Java

options[0]));

}

}

public class ShowDialog3 {

public static void main(String[] args) {

MyFrame frame = new MyFrame(200, 100);

frame.setTitle("Confirm Dialogs");

frame.setVisible(true);

}

}

ภาพท 16.3 แสดงการใช Option Dialog จากโปรแกรม ShowDialog3.java JDesktopPane และ JInternalFrame JInternalFrame คอหนาตางยอยใน Windows หลก เชน ในโปรแกรม Microsoft Word ผใชงานสามารถเปดเอกสารเพอใชงานไดมากกวาหนงเอกสาร โดยเอกสารทกตวทเปดจะอยภายใต Windows หลก การสรางหนาตางยอย เรมจากการสรางคลาส JDesktopPane เปน Pane หลกและสราง JInternalFrame เพอเพมลงใน JDesktopPane ซงอาจสราง JInternalFrame ไดมากกวาหนง สวนการสราง GUI ใน JInternalFrame เหมอนกบการสราง GUI บน JFrame ทกประการ ค าสงทใชในการสราง JInternalFrame คอ JInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable,

boolean iconifiable)

โปรแกรม ShowJInternalFrame.java แสดงการใชงาน JInternalFrame โดยเมอผใชงานคลกทเมน “Click Here” ดงภาพท 16.4 จะปรากฏหนาตาง JInternalFrame ขน 1 หนาตาง import java.awt.*;

import java.awt.event.KeyEvent;

import java.awt.event.*;

import javax.swing.*;

class MenuFrame extends JFrame implements ActionListener{

private JMenuBar menuBar;

private JMenu clickHereMenu;

private JMenuItem addMenuItem;

private JDesktopPane desktopPane;

private static int count=1; public MenuFrame (int width, int height){

Toolkit tk = getToolkit();

Page 7: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 323

Dimension screen = tk.getScreenSize();

setBounds( (screen.width - width)/2,

(screen.height - height)/2, width, height);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setTitle("Test JInternalFrame");

// สราง MenuBar menuBar = new JMenuBar();

// สราง JMenu clickHereMenu = new JMenu("Click Here");

// สราง JMenuItem addMenuItem = new JMenuItem("Add JInternalFrame");

// เพม JMenuItem ไปท JMenu clickHereMenu.add(addMenuItem);

// เพม JMenu ไปท MenuBar menuBar.add(clickHereMenu);

// ตงคาให Windows แสดง Menu; setJMenuBar(menuBar);

// เพม Action Listener ใหกบ MenuItem addMenuItem.addActionListener(this);

// สราง JDesktopPane ส าหรบบรรจ JInternalFrame desktopPane = new JDesktopPane();

// เพม JDesktopPane ไปท JFrame getContentPane().add(desktopPane);

}

public void actionPerformed(ActionEvent e) {

// สราง JInternalFrame JInternalFrame internalFrame = new

JInternalFrame("Document " + count++, true, true, true, true);

// สราง JTextArea ส าหรบแสดงผลลพธจากการเลอกเมนตางๆ JTextArea text = new JTextArea();

JScrollPane scroll = new JScrollPane(text);

internalFrame.getContentPane().add(scroll);

internalFrame.setSize(200, 200);

//เพม JInternalFrame ไปท JDesktopPane desktopPane.add(internalFrame);

internalFrame.show();

}

}

public class ShowJInternalFrame{

public static void main(String[] args) {

MenuFrame frame = new MenuFrame(600,600); frame.setVisible(true);

}

}

Page 8: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

324 การเขยนโปรแกรมภาษา Java

การใชงาน JInternalFrame มขอควรปฏบตดงน เมอสราง JInternalFrame แลวจ าเปนตองมการตงคาขนาดของ JInternalFrame ดวยทกครงเพราะคาขนาดเรมตนของ JInternalFrame เปน 0 ค าสงทใชในการตงคาเชน setBounds() setSize() หรอ pack() เมอมการตงคาขนาดของ JInternalFrame แลว ตองเรยกใช Method show() หรอ setVisible(true) ส าหรบทก JInternalFrame ดวย ไมเชนนนใน Windows จะไมแสดง JInternalFrame นน

ภาพท 16.4 แสดงผลลพธจากโปรแกรม ShowJInternalFram.java

JColorChooser JColorChooser ใชแสดง Dialog ส าเรจภาพทใชในการเลอกสทตองการ ค าสงทใชในการสราง JColorChooser Dialog คอ showDialog(Component component, String title, Color initialColor)

ตวแปร title เปนการระบถงขอความทแสดงใน Dialog Title สวนคา initialColor เปนคาของสเรมตนเมอมการแสดง Dialog โปรแกรม ShowJColorChooser.java แสดงการใชงาน JColorChooser เพอเปลยนสฉากหลงของ JFrame import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

import java.awt.event.*;

class MyFrame extends JFrame implements ActionListener{

private Color color;

public MyFrame(int width, int height) {

Toolkit tk = getToolkit();

Dimension screen = tk.getScreenSize();

setBounds( (screen.width - width)/2,

(screen.height - height)/2, width, height);

Page 9: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 325

setDefaultCloseOperation(EXIT_ON_CLOSE);

JButton colorButton = new JButton("Change background Color");

colorButton.addActionListener(this);

getContentPane().setLayout(new FlowLayout());

getContentPane().add(colorButton);

}

public void actionPerformed(ActionEvent e) {

// แสดง Dialog ส าหรบการเลอกสโดยใหสเรมตนเปนสเขยว color = JColorChooser.showDialog(this, "Pick a color", Color.GREEN);

// ถาผใชงานกดปม Cancle ใน Dialog คาทสงกลบจะเปน null // ดงนนจ าเปนตองตรวจสอบคาทสงกลบดวย if(color != null)

getContentPane().setBackground(color);

}

}

public class ShowJColorChooser {

public static void main(String[] args) {

MyFrame frame = new MyFrame(200,200);

frame.setTitle("JColorChooser");

frame.setVisible(true);

}

}

ภาพท 16.5 แสดงผลลพธจากโปรแกรม ShowJColorChooser.java JFileChooser ใน Package javax.swing มคลาสชอ JFileChooser ซงท าหนาทเปน Dialog ทชวยในการ Open และ Save แฟมขอมล ค าสงทใชในการสรางวถต JFileChooser คอ JFileChooser fileChooser = new JFileChooser();

Page 10: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

326 การเขยนโปรแกรมภาษา Java

การสราง JFileChooser โดยไมระบตวแปรใน Constructor ท าใหเมอมการเปด Dialog ของ JFileChooser ท าใหแสดงขอมลของ User’s Default Directory แตผเขยนโปรแกรมสามารถระบ Directory เรมตนใหกบ JFileChooser ไดโดยใช Construtor ดงตอไปน JFileChooser fileChooser = JFileChooser(File currentDirectory);

// หรออาจใชค าสงตอไปน // ระบคา Current Directory ใหกบ JFileChooser fileChooser.setCurrentDirectory(new File(“.”));

ในกรณทผเขยนโปรแกรมคาดหวงใหผใชงานเลอกแฟมขอมลทก าหนดไวแลวและใหผใชงานสามารถเลอกแฟมขอมลไดมากกวา 1 แฟมขอมล ใชค าสงตอไปน // เลอกแฟมขอมลชอตามตวแปร filename เทานน fileChooser.SetSelectedFile(new File(filename));

// อนญาตใหผใชงานสามารถเลอกไดหลายแฟมขอมล fileChooser.setMultiSelecteionEnabled(true);

ค าสงตอไปเปนค าสงใหแสดง JFileChooser Dialog ซงแบงเปน 2 ค าสงคอ ค าสงทใชในการ Open และ Save แฟมขอมล โดยเมอจบค าสงจะมการสงคากลบเปน

JFileChooser.CANCEL_OPTION เมอผใชงานกดปม Cancel JFileChooser.APPROVE_OPTION เมอผใชงานกดปม Open หรอ Save JFileChooser.ERROR_OPTION เมอมการปด Dialog โดยการกดปมกากบาท

ดงนนหลงจากค าสงนท างานเสรจแลว จ าเปนตองมการตรวสอบคาวาผใชงานกดปมใด เพอสามารถก าหนดการท างานส าหรบขนตอนตอไปไดถกตอง int result = fileChoooser.showOpenDialog(Component parent);

//หรอ int result = fileChooser.showSaveDialog(Component parent);

ตวอยางเชนคา result เทากบ JFileChooser.APPROVE_OPTION แสดงวาผใชงานเลอกปม Open/Save สวนการหาวาผใชงานเลอกแฟมขอมลใดใชค าสง File file = fileChooser.getSelectedFile();

String filename = file.getName();

//ในกรณทอญาตใหผใชงานสามารถเลอกแฟมขอมลไดมากกวาหนงแฟมขอมลใชค าสงตอไปน File[] file = fileChooser.getSelectedFiles();

โปรแกรม ShowJFileChooser1.java แสดงการเปดแฟมขอมลชนดทเปนตวอกษรซงใช JInternalFrame ในการแสดงผลของแฟมขอมล

Page 11: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 327

import java.awt.*;

import java.awt.event.KeyEvent;

import java.awt.event.*;

import javax.swing.*;

import java.io.*;

class MenuFrame extends JFrame implements ActionListener{

private JMenuBar menuBar;

private JMenu fileMenu;

private JMenuItem openMenuItem;

private JDesktopPane desktopPane;

public MenuFrame (int width, int height){

Toolkit tk = getToolkit();

Dimension screen = tk.getScreenSize();

setBounds( (screen.width - width)/2,

(screen.height - height)/2, width, height);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setTitle("Warning! Open Text File Only");

// สราง Menu menuBar = new JMenuBar();

fileMenu = new JMenu("File");

openMenuItem = new JMenuItem("Open");

fileMenu.add(openMenuItem);

menuBar.add(fileMenu);

// ตงคาให Windows แสดง Menu setJMenuBar(menuBar);

// เพม ActionListener ใหกบ MenuItem openMenuItem.addActionListener(this);

desktopPane = new JDesktopPane();

getContentPane().add(desktopPane);

}

public void actionPerformed(ActionEvent evt) {

// สราง JFileChooser โดยระบคาเรมตนเปน Current Directory JFileChooser fileChooser = new JFileChooser(new File("."));

// ทดสอบวาผใชงานกดปม Open จรง if(fileChooser.showOpenDialog(this) ==

JFileChooser.APPROVE_OPTION) {

File file = fileChooser.getSelectedFile();

JInternalFrame internalFrame =

new JInternalFrame(file.getName(), true, true, true, true);

// สราง JTextArea ส าหรบแสดงขอมลในแฟมขอมล JTextArea text = new JTextArea();

// ตงคา Tab หรอยอหนา ใหมขนาด 3 ตวอกษร text.setTabSize(3);

// ตงคาให JTextArea สามารถตดค าได text.setWrapStyleWord(true);

JScrollPane scroll = new JScrollPane(text);

internalFrame.getContentPane().add(scroll);

internalFrame.setSize(200,200); desktopPane.add(internalFrame);

internalFrame.show();

Page 12: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

328 การเขยนโปรแกรมภาษา Java

// เปดแฟมขอมลทผใชงานเลอก try {

BufferedReader reader = new BufferedReader (

new InputStreamReader (

new FileInputStream (file)));

String st = reader.readLine();

while( st != null ){

// เพมขอมลไปท JTextArea ครงละ 1 บรรทด text.append(st+"\n");

st = reader.readLine();

}

} // จบค าสง try catch (IOException e) {

System.out.println("Error while reading the file");

System.exit(1);

} // จบค าสง catch

} // จบค าสง if else {

JOptionPane.showMessageDialog(this,"Plese at least pick a file");

} // จบค าสง else

} // จบค าสง ActionPerformed() }

public class ShowJFileChooser1 {

public static void main(String[] args) {

MenuFrame frame = new MenuFrame(600, 600);

frame.setVisible(true);

}

}

ภาพท 16.6 ผลลพธจากโปรแกรม ShowJFileChooser1.java

Page 13: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 329

โปรแกรม ShowJFileChooser1.java อนญาตใหผใชงานเลอกแฟมขอมลไดทกประเภท ถาตองการเจาะจงใหผใชงานเลอกแฟมขอมลทผเขยนโปรแกรมก าหนดไว จ าเปนตองสราง File Filter ตวอยางการสราง File Filter ทรบแฟมขอมลทมนามสกล .java คอ import javax.swing.filechooser.FileFilter;

import java.io.File;

// สรางคลาสใหมท extends javax.swing.filechooser.FileFilter // และ Override Method accept() และ getDescription() class JavaFilter extends FileFilter {

public boolean accept(File f) {

// สงคา True เมอแฟมขอมลทผใชงานเลอกลงทายดวย “.java” // หรอเปน Directory return f.getName().toLowerCase().endsWith(“.java”) || f.isDirectory();

}

public String getDescription() {

return “Java File”;

}

}

เมอสราง File Filter แลว ขนตอนตอไปเรยกใชค าสง JFileChooser fileChooser = new JFileChooser();

fileChooser.addChoosableFileFilter(new JavaFilter());

โปรแกรม ShowJFileChooser2.java แสดงการใช File Filter เพอเปดแฟมขอมลทเปนประเภท Java เทานน import java.awt.*;

import java.awt.event.KeyEvent;

import java.awt.event.*;

import javax.swing.*;

import java.io.*;

import javax.swing.filechooser.FileFilter;

import java.io.File;

// สรางคลาสใหมท extends javax.swing.filechooser.FileFilter // และ Override Method accept() และ getDescription() class JavaFilter extends FileFilter {

public boolean accept(File f) {

// สงคา True เมอแฟมขอมลทผใชงานเลอกลงทายดวย “.java” // หรอเปน Directory return f.getName().toLowerCase().endsWith(".java") || f.isDirectory();

}

public String getDescription() {

return "Java File";

}

Page 14: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

330 การเขยนโปรแกรมภาษา Java

}

class MenuFrame extends JFrame implements ActionListener{

private JMenuBar menuBar;

private JMenu fileMenu;

private JMenuItem openMenuItem;

private JDesktopPane desktopPane;

public MenuFrame (int width, int height){

Toolkit tk = getToolkit();

Dimension screen = tk.getScreenSize();

setBounds( (screen.width - width)/2,

(screen.height - height)/2, width, height);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setTitle("Warning! Open Text File Only");

// สราง Menu menuBar = new JMenuBar();

fileMenu = new JMenu("File");

openMenuItem = new JMenuItem("Open");

fileMenu.add(openMenuItem);

menuBar.add(fileMenu);

// ตงคาให Windows แสดง Menu setJMenuBar(menuBar);

// เพม Action Listener ใหกบ MenuItem openMenuItem.addActionListener(this);

desktopPane = new JDesktopPane();

getContentPane().add(desktopPane);

}

public void actionPerformed(ActionEvent evt) {

// สราง JFileChooser โดยระบคาเรมตนเปน Current Directory JFileChooser fileChooser = new JFileChooser(new File("."));

// ทดสอบวาผใชงานกดปม Open จรง fileChooser.addChoosableFileFilter(new JavaFilter());

if(fileChooser.showOpenDialog(this) ==

JFileChooser.APPROVE_OPTION) {

File file = fileChooser.getSelectedFile();

JInternalFrame internalFrame =

new JInternalFrame(file.getName(), true, true, true, true);

// สราง JTextArea ส าหรบแสดงขอมลในแฟมขอมล JTextArea text = new JTextArea();

// ตงคา Tab ใหมขนาด 3 ตวอกษร text.setTabSize(3);

// ตงคาให JTextArea สามารถตดค าได text.setWrapStyleWord(true);

JScrollPane scroll = new JScrollPane(text);

internalFrame.getContentPane().add(scroll);

internalFrame.setSize(200, 200);

desktopPane.add(internalFrame);

internalFrame.show();

// เปดแฟมขอมลทผใชงานเลอก try {

BufferedReader reader = new BufferedReader (

new InputStreamReader (

new FileInputStream (file)));

Page 15: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 331

String st = reader.readLine();

while( st != null ){

//เพมขอมลไปท JTextArea ครงละ 1 บรรทด text.append(st+"\n");

st = reader.readLine();

}

} // จบค าสง try catch (IOException e) {

System.out.println("Error while reading the file");

System.exit(1);

} // จบค าสง catch

} // จบค าสง if else {

JOptionPane.showMessageDialog(this,"Plese at least pick a file");

} // จบค าสง else

} // จบค าสง ActionPerformed() }

public class ShowJFileChooser2 {

public static void main(String[] args) {

MenuFrame frame = new MenuFrame(600, 600);

frame.setVisible(true);

}

}

ภาพท 16.7 แสดงการใช File Filter จากโปรแกรม ShowJFileChooser2.java Look and Feel GUI ในแตละระบบปฏบตการมความแตกตางกน ดงนนผใชงาน GUI ในระบบปฏบตการ UNIX อาจไมคนเคยกบ GUI ในระบบปฏบตการ Mac OS X แตถาก าหนดใหรปแบบการแสดงผลของ GUI โดยทวไปมลกษณะเฉพาะแบบเดยว หมายความถง ถาน าโปรแกรมเดยวกนไปท างานบนระบบปฏบตการ UNIX หรอ Mac

Page 16: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

332 การเขยนโปรแกรมภาษา Java

OS X รปแบบของ GUI จะมลกษณะเหมอนกน เพอท าใหผใชงานเกดความคนเคยรปแบบของ GUI และผใชงานสามารถใชงานโปรแกรมนบนระบบปฏบตการทตางกน โดยทไมตองพะวงถงรปแบบทเปลยนไปของ GUI

แตบางครงผใชงานระบบปฏบตการ Microsoft Windows จนเคยชนตองการใชรปแบบ GUI ทเปนลกษณะของ Microsoft Windows เทานน ดงนนเพอเพอใหเกดความยดหยนในการแสดงรปแบบ GUI ในแบบตางๆ นอกเหนอจากแบบเดม Java ไดสรางค าสงการตงคา Look and Feel เพอใหผเขยนโปรแกรมสามารถตงคาการแสดงรปแบบ GUI ในลกษณะทตองการได ค าสงทใชในการตงคา Look and Feel คอ public static void main(String[] args) {

try {

UIManager.setLookAndFeel(String className);

} catch (Exception e) { }

JFrame frame = new JFrame();

}

ตวแปร className สามารถเปนได ดงน

"javax.swing.plaf.metal.MetalLookAndFeel" เปนคาเรมตนในกรณทไมมการตงคา Look and Feel อกชอเรยก Java Look and Feel

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel" ส าหรบแสดงผล GUI คลายระบบ Microsoft Windows และใชไดในระบบปฏบต Windows เทานน

"com.sun.java.swing.plaf.motif.MotifLookAndFeel" ใชไดกบทกระบบปฏบตการ "javax.swing.plaf.mac.MacLookAndFeel" ใชไดกบระบบปฏษตการ Mac OS เทานน

การตงคา Look and Feel แสดงในโปรแกรม ShowJFileChooser2LookandFeel.java ซงแกไขจากโปรแกรม

ShowJFileChooser2.java โดยเพมค าสงทใชในการตงคา Look and Feel ใหเปนแบบ "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" public class ShowJFileChooser2LookandFeel {

public static void main(String[] args) {

try {

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

} catch (Exception e) { }

MenuFrame frame = new MenuFrame(600,600);

frame.setVisible(true);

}

}

Page 17: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 333

ภาพท 16.8 แสดงการตงคา Look and Feel จากโปรแกรม ShowJFileChooser2LookandFeel.java

เมอมการตงคา Look and Feel แลว ถาตองการเปลยนเปนรปแบบอน สามารถใชค าสง updateComponentTreeUI(frame) เพอเปลยนคา Look and Feel ดงตวอยาง UIManager.setLookAndFeel(String className);

SwingUtilities.updateComponentTreeUI(frame);

Applet การเรยกดขอมลของเวบไซตผานระบบอนเทอรเนต มลกษณะการท างานทเรยกวา Client/Server คอเครองคอมพวเตอรทเปนผรองขอขอมล (Client) สงสญาณค าขอใชบรการไปทเครองผใหบรการ (Server) เพอขอใชบรการหรอขอขอมล ในกรณทเปนการดขอมลในเวบ ผรองขอระบถงแฟมขอมลทอยบนเครองของผใหบรการ เมอผใหบรการไดรบการรองขอเรยบรอยแลว ผใหบรการจะท าการตรวจสอบวาแฟมขอมลทผขอบรการตองการมจรงหรอไม ถามจงสงแฟมขอมลนนผานระบบอนเตอรเนตไปใหผรองขอ ในการใหบรการทกครงจะมการค านวณเกดขนทเครองทใหบรการ เชน การตรวจสอบการยมหนงสอจากหอสมดในมหาวทยาลยผานระบบเวบ นกศกษาใชเครองคอมพวเตอรทบานเพอตรวจสอบวานกศกษาไดยมหนงสออะไรบาง และมก าหนดสงคนเมอใด เมอนกศกษาเรยกดขอมล เครองทใหบรการตองท าการตรวจสอบขอมลซงจ าเปนตองเรยกขอมลจากระบบฐานขอมลซงใชเวลาในการเขาถงขอมล เมอไดขอมลแลวจงสงขอมลกลบไปใหเครองทขอใชบรการ งานทงหมดทกลาวมานตองใชเวลาในการท างาน ดงนนถามผตองการตรวจรายการยมหนงสอพรอมกนหลายคน เปนผลใหเครองทใหบรการตองท างานหนก และอาจท าใหประสทธภาพโดยรวมของระบบแยลงไดเพราะการท างานเกอบทกขนตอนท าทเครองผใหบรการ ดงนน Java ไดออกแบบโดยเนนการท างานทเครองขอใชบรการเปนหลก และมการรองขอขอมลในกรณทจ าเปนเทานน การท างานลกษณะนท าใหเครองทใหบรการท างานนอยลงและท าใหประสทธภาพของระบบโดยรวมดขน การท างานลกษณะนเรยกวา Applet

Page 18: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

334 การเขยนโปรแกรมภาษา Java

Server

Client

HelloWorld.class

HelloWorld.class

Hello World

โปรแกรมทเขยนขนในลกษณะ Applet ตองผานตวแปลภาษา Java ไดแฟมขอมลนามสกล “.class” และอยในเครองผใหบรการ เมอเครองผขอใชบรการตองการ Run Program น ผขอบรการจะดงขอมล “.class” จากเครองทใหบรการโดยผานระบบอนเตอรเนต และน า “.class” มาท างานในเครองของตน ดงภาพท 16.9

ภาพท 16.9 แสดงการดง HelloWorld.class มาท างานในเครอง Client เครองขอใชบรการไมสามารถดงโปรแกรม Applet ไดโดยตรงจากเครองทใหบรการ แตตองอาศย Web Browser ดงนนจงตองสรางแฟมขอมลนามสกล “.html” เพอเปนแฟมขอมลระบถงโปรแกรม Applet ทตองการใหท างาน รปแบบของการเขยนแฟมขอมล “.html” คอ “HelloWorld.html”

<HTML>

<HEAD>

<TITLE> Hello World Applet </TITLE>

</HEAD>

<BODY>

<H1>This is an Applet </H1>

<APPLET CODE="HelloWorld.class" WIDTH="200" HEIGHT="200">

</APPLET>

</BODY>

</HTML>

ตวอยางโปรแกรม HelloWorld.java แสดงการเขยนโปรแกรมชนด Applet ซงจะแสดงขอความ “Hello World” ทาง Web Browser import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class MyPanel extends JPanel{

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawString("Hello World Applet", 50, 50);

}

}

public class HelloWorld extends JApplet{

public void init() {

getContentPane().add(new MyPanel());

}

}

Page 19: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 335

จากตวอยางโปรแกรม HelloWorld ประกอบดวย 2 แฟมขอมลคอ HelloWorld.html และ HelloWorld.java เมอมการน าแฟมขอมล HelloWorld.java ผานตวแปลภาษาเรยบรอยแลวจะไดแฟมขอมล HelloWorld.class และจะถกเรยกใชงานผาน HelloWorld.html ซงม Tag <APPLET> ระบวาตองการเรยกใชงาน HelloWorld.class และใหแสดงความกวางเปน 200 Pixels สง 200 Pixels การทดสอบวาโปรแกรม HelloWorld ท างานไดม 2 วธคอ

ใช Web Browser เชน Internet Explorer หรอ FireFox หรอ Google Chrome ซงการใชงาน Browser นจ าเปนตองมการตดตง Java Plug-in กอน การทดสอบโปรแกรมท าโดยเปดแฟมขอมล HelloWorld.html ใน Web Browser โดยตรง

ใชโปรแกรม appletviewer ซงมาพรอมกบชดโปรแกรม SDK1.4 ขนไป วธทดสอบท าไดโดยใชค าสง appletviewer ท Command Prompt และตามดวยชอของแฟมขอมล Html เชน appletviewer HelloWorld.html

ภาพท 16.10 แสดงภาพการใช Web Browser และโปรแกรม Appletviewer เพอทดสอบโปรแกรม HelloWorld.java

กฎการเปลยนโปรแกรมทใช JFrame ใหเปน Applet โปรแกรมทเขยนขนโดยใช GUI แบบ Swing สามารถเปลยนเปน Applet ไดตามกฏตอไปน

1. สรางแฟมขอมล HTML ซงม Tag <APPLET> ระบถงโปรแกรมทตองการใหท างาน 2. ลบค าสง main() ทงไป และยายค าสงตางๆ ใน main() ไปไวในคลาสท extends JFrame แทนเนองจาก

ค าสง main() บรรจค าสงทใชในการสราง JFrame แตเมอเปลยนมาใช Applet ไมตองระบค าสงทสราง JFrame เพราะ Applet นนถกสรางอตโนมตโดย Web Browser

3. มองหาคลาสทมการ extends JFrame และเปลยนประโยค extends JFrame ใหเปน extends JApplet และใชสวนขยายหนาคลาสใหเปน public และเปลยนชอคลาสเปนของคลาสหลกทตรงกบชอของแฟมขอมลแทน

ใช Internet Explorer ทดสอบ ใชโปรแกรม Appletviewer ทดสอบ

Page 20: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

336 การเขยนโปรแกรมภาษา Java

4. ลบค าสง setSize() หรอค าสง setBounds() เนองจากขนาดของ Applet ถกก าหนดโดยภาษา HTML เชน <APPLET CODE="HelloWorld.class" WIDTH="200" HEIGHT="200"> และค าสง setTitle() ดวย เพราะ Title ของ Applet ถกระบใน HTML เชนกน และค าสงทเกยวของปรบขนาดของ JFrame ทงหมด รวมถงค าสง setDefaultCloseOperation(EXIT_ON_CLOSE) ดวยเพราะโปรแกรม Applet จะถกปดเมอผใชงานปด Web Browser ดงนนค าสงนจงไมสามารถใชใน Applet ได

5. เปลยน Constructor ของคลาสท extends JApplet (จากขอท 3) ใหเปน public void init() แทน โปรแกรม ShowCircle.java แสดงการเขยนโปรแกรมในแบบ Application โดยใช JFrame สวนโปรแกรม ShowCircleApplet.java แสดงวธการเปลยนโปรแกรม ShowCicle.java ใหแสดงเปน Applet ตามกฎทง 5 ขอ import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

import java.awt.event.*;

import javax.swing.event.*;

//คลาส PaintPanel ใชในการวาดรปวงกลม class PaintPanel extends JPanel {

public PaintPanel(String name) {

setBorder(BorderFactory.createTitledBorder(new

EtchedBorder(), name) );

}

//Method ทใชในการวาดรปวงกลม public void paintComponent(Graphics g) {

super.paintComponent(g);

g.setColor(Color.RED); g.fillOval(20, 20, 80, 80); g.fillOval(100, 50, 50, 50); g.fillOval(50, 100, 30, 30); g.fillOval(100, 100, 60, 60);

}

}

class MyFrame extends JFrame {

PaintPanel paintPanel;

public MyFrame(int width, int height) {

Toolkit tk = getToolkit();

Dimension screen = tk.getScreenSize();

setBounds( (screen.width - width)/2,

(screen.height - height)/2, width, height);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setTitle("Show Circle");

/ /สราง JPanel ส าหรบวาดวงกลม paintPanel = new PaintPanel("Paint");

getContentPane().add(paintPanel, BorderLayout.CENTER);

setVisible(true);

}

}

public class ShowCircle {

public static void main(String[] args) {

MyFrame frame = new MyFrame(200, 200);

}

Page 21: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 337

}

ภาพท 16.11 แสดงผลลพธจากโปรแกรม ShowCircle.java

โปรแกรม ShowCircleApplet.java แสดงการเปลยนค าสงในโปรแกรม ShowCircle.java เพอใหแสดงไดใน Web Browser โดยสงเกตการเปลยนแปลงไดจากแทบทเปนสเขมในโปรแกรม ShowCircle.java import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

import java.awt.event.*;

import javax.swing.event.*;

// คลาส PaintPanel ใชในการวาดรปวงกลม class PaintPanel extends JPanel {

public PaintPanel(String name) {

setBorder(BorderFactory.createTitledBorder(new

EtchedBorder(), name) );

}

// Method ทใชในการวาดรปวงกลม public void paintComponent(Graphics g) {

super.paintComponent(g);

g.setColor(Color.RED);

g.fillOval(20, 20, 80, 80);

g.fillOval(100, 50, 50, 50);

g.fillOval(50, 100, 30, 30);

g.fillOval(100, 100, 60, 60);

}

}

public class ShowCircleApplet extends JApplet {

PaintPanel paintPanel;

public void init() {

// สราง JPanel ส าหรบวาดวงกลม paintPanel = new PaintPanel("Paint");

getContentPane().add(paintPanel, BorderLayout.CENTER);

setVisible(true);

}

}

Page 22: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

338 การเขยนโปรแกรมภาษา Java

ล าดบตอไปแสดง HTML ทใชในการเรยก ShowCircleApplet.class

“ShowCircleApplet.html”

<HTML>

<HEAD>

<TITLE> Show Circle</TITLE>

</HEAD>

<BODY>

<H1>This applet will draw circles to the screen</H1>

<APPLET CODE="ShowCircleApplet.class" WIDTH="200" HEIGHT="200">

</APPLET>

</BODY>

</HTML>

ภาพท 16.12 แสดงผลลพธจากโปรแกรม ShowCircleApple.java ขอควรระวงเกยวกบ Applet ขอจดกดในการเขยนโปรแกรม Applet คอเรองของความปลอดภยของระบบ เนองจากการท างานของ Applet เกดขนทเครองของผขอบรการ เมอผใชงานเปดหนาของเวบทม Applet ผใชงานไมสามารถหยดการท างานของ Applet ไดเลย สมมตโปรแกรม Applet ท างานเกยวกบเรองแฟมขอมล โปรแกรม Applet กสามารถลบแฟมขอมลทงหมดทอยในฮารดดกส หรออานขอมลทเปนความลบและสงไปทเครองคอมพวเตอรอนได ดงนนการจ ากดความสามารถของโปรแกรม Applet เปนสงทหลกเลยงไมได ดงน

โปรแกรม Applet ไมสามารถเรยกโปรแกรมใดๆ ใหท างานไดในเครองของผขอใชบรการ

Page 23: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 339

โปรแกรม Applet ไมสามารถตดตอสอสารผานระบบเครอขายกบเครองคอมพวเตอรเครองอนได ยกเวนการตดตอสอสารระหวางเครองผใหบรการทมการดง Applet มาท างานเทานน

โปรแกรม Applet ไมสามารถอานหรอเขยนขอมลในเครองของผขอใชบรการได เมอมการสราง JFrame ใหมจาก Applet ท าใหเกด Pop-up Windows ขนแตจะมขอความเตอนใหผใชงาน

ทราบวา Pop-up Windows นถกสรางขนจาก Applet วธการสรางโปรแกรมซงสามารถท างานไดเปน Application และ Applet java.awt.Panel

java.applet.Applet

javax.swing.JApplet

เมอพจารณาการ Inherit ของคลาส JApplet แลวจะเหนวา JApplet เปน Panel ดงนน JApplet สามารถ

ถกเพมลงใน JFrame ได เพอใหโปรแกรมสามารถท างานไดทง Application และ Applet โดยเพมค าสงลงใน Method main() ในกรณทเรยกโปรแกรมจาก Web Browser ค าสง main() จะไมถกเรยกใชงาน แตเมอสงใหโปรแกรมท างานโดยใช Command Prompt ค าสง main() จะถกเรยกใชงาน

โปรแกรม ShowCircleAppAndApplet.html และ ShowCircleAppAndApplet.java แสดงโปรแกรมทสามารถท างานไดทง Application และ Applet โดยไมตองมการแกไขโปรแกรม

import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

import java.awt.event.*;

import javax.swing.event.*;

// คลาส PaintPanel ใชในการวาดรปวงกลม class PaintPanel extends JPanel {

public PaintPanel(String name) {

setBorder(BorderFactory.createTitledBorder(new

EtchedBorder(), name) );

}

// Method ทใชในการวาดรปวงกลม public void paintComponent(Graphics g) {

super.paintComponent(g);

g.setColor(Color.RED);

g.fillOval(20, 20, 80, 80);

g.fillOval(100, 50, 50, 50);

g.fillOval(50, 100, 30, 30);

g.fillOval(100, 100, 60, 60);

}

}

public class ShowCircleAppAndApplet extends JApplet {

PaintPanel paintPanel;

public void init() {

// สราง JPanel ส าหรบวาดวงกลม paintPanel = new PaintPanel("Paint");

getContentPane().add(paintPanel, BorderLayout.CENTER);

Page 24: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

340 การเขยนโปรแกรมภาษา Java

setVisible(true);

}

// เพม Method main() public static void main(String[] args) {

// สรางวตถของคลาสเพอใชใน JFrame ShowCircleAppAndApplet applet = new ShowCircleAppAndApplet();

JFrame frame = new

JFrame("Run programe both application and applet");

// เพม applet ใน JFrame frame.getContentPane().add(applet, BorderLayout.CENTER);

frame.setSize(200,200);

// เรยก init() ดวยเพอให applet เรมท างาน applet.init();

frame.setVisible(true);

}

}

ตอไปแสดง HTML ทใชในการเรยก ShowCircleAppAndApplet.class “ShowCircleAppAndApplet.html”

<HTML>

<HEAD>

<TITLE> Show Circle</TITLE>

</HEAD>

<BODY>

<H1>This applet will draw circles to the screen</H1>

<APPLET CODE="ShowCircleAppAndApplet.class" WIDTH="200" HEIGHT="200">

</APPLET>

</BODY>

</HTML>

การเขยนโปรแกรมใหท างานไดทง Application และ Applet ชวยเพมความยดหยนของโปรแกรม ถาโปรแกรมนใชงานเปน Application มากอน และเมอมความตองการใหสามารถใชโปรแกรมนผาน Web Browser ไดดวย โดยผเขยนโปรแกรมกไมจ าเปนไมตองแกใขโปรแกรมเลยแมแตบรรทดเดยว

Page 25: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 341

สรป ภาษา Java ม GUI Component ส าเรจภาพทชวยในการเขยนโปรแกรมไดเรวขน ตวอยางเชน JColorChooser หรอ JFileChooser เปนคลาสทแสดง GUI ส าเรจรป ผเขยนโปรแกรมเรยกใชงานคลาสเหลานไดทนท ซงเปน GUI มาตราฐานทนยมใช

JInternalFrame อนญาตใหผเขยนโปรแกรมสามารถสราง Multiwindow ใน JFrame ได เหมอนโปรแกรม Microsoft Word ซงผใชงานสามารถเปดเอกสารท างานไดหลายเอกสารในโปรแกรมเดยว สวน JOptionPane ชวยแสดง Dialog ทางจอภาพ ผเขยนโปรแกรมสามารถใช JOptionPane ชวยในการแสดงขอความสนๆ ค าเตอน หรอ รบขอมลจากผใชงานได Applet เปนโปรแกรมทท างานอยทางฝงของเครองขอใชบรการเปนหลก เพอลดการประมวลผลทเครองใหบรการ สงผลใหระบบโดยรวมท างานไดดขน Applet ใชคกบ Web Browser โดยทในโปรแกรม Web Browser ตองตดตง Plug-in Java กอน จงสามารถแสดง Applet ได การใชงาน Applet มความนยมมากขนตามความนยมใชงานระบบอนเตอรเนต เนองจากผใชงานสามารถท างานผานระบบเวบได ขอดของการใช Applet ในการสราง Web Site คอการตอบโตกบผใชงานแบบทนท (Realtime Response) ตวอยางของ Applet เชนโปรแกรมดการซอขายหนออนไลน หรอ การเลนเกมออนไลน เปนตน ในเรองสดทายของบทนกลาวถงวธการเขยนโปรแกรมใหสามารถท างานเปนทง Application และ Applet ซงเปนการเพมความสามารถของโปรแกรม ใหท างานภายใตทกสภาพแวดลอม เชน โปรแกรมสามารถใชในองคกรเปน Application หรอสามารถใชโปรแกรมเดยวกนผานเวบเปน Applet ไดทนทโดยทไมตองแกไขโปรแกรมเลย

Page 26: บทที่ 6 GUI ขั้นสูง และ Applet Advanced GUI and Applettulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter16.pdf · 320 การเขียนโปรแกรมภาษา

342 การเขยนโปรแกรมภาษา Java

แบบฝกหดทายบทท 16

1. อธบายการสราง JInternalFrame 2. Look and Feel คออะไร 3. อธบายวธการเขยนโปรแกรมใหสามารถท างานเปนทง Application และ Applet 4. อธบายขอจ ากดของการใชงาน Applet

Programming Problems

1. จงเขยนโปรแกรมเลยนแบบ NotePad แตใหสามารถท างานไดหลายหนาตางโดยใช JInternalFrame 2. จงเขยนเกมโอเอกซใหท างานบน Web Browser