Professional Documents
Culture Documents
Java Ch11 GUI&EventHandling
Java Ch11 GUI&EventHandling
faa)
ในบททีผ ่ านมาเราไดเห็นการสราง Frame แบบคราว ๆ เพื่อใชรองรับการสรางภาพสองมิตแ ิ บบ
ตาง ๆ ในบทนี้เราจะมาดูกันถึงสวนประกอบบางสวนของ Graphical User Interface (GUI) ที่
Java มีใหโดยเฉพาะการสราง GUI ดวย Swing พรอมกันนี้เราจะมาดูกันถึงวิธีการโตตอบกับ
user ในรูปแบบตาง ๆ ที่ Java มีให เชน การใชปม
ุ และการสนองตอบเมื่อ user กดปุม เปนตน
ในเบื้องตนนี้เราจะแสดงถึงกระบวนการและวิธีการในการสรางองคประกอบตาง ๆ อยางงาย ๆ
และเมื่อถึงคราวที่ตองใชเครื่องมือชวย เราก็จะแสดงถึงการใช Netbeans ในการสราง
application เหลานั้น
หลังจากจบบทเรียนนี้แลวผูอานจะไดทราบถึง
button.setVerticalTextPosition(AbstractButton.CENTER);
button.setHorizontalTextPosition(AbstractButton.LEADING);
button.setMnemonic(KeyEvent.VK_T);
สวนสําคัญทีท
่ าํ ใหปุมมีการสนองตอบตอการกดก็คือ คําสั่งที่กําหนดใหมีการฟงเหตุการณที่จะ
เกิดขึ้น
button.addActionListener(this);
dateFormatter = DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.SHORT, thLocale);
today = new Date();
dateOut = dateFormatter.format(today);
344
บทที่ 11: GUI และ Event Handling
Code ทั้งหมดของโปรแกรมตัวอยางมีดังนี้
345
เริ่มตนการเขียนโปรแกรมดวย Java
Border layout เปน layout manager ตัวหนึง่ ที่ทาํ ใหการจัดวาง component เปนไปตามความ
ตองการของเราไดเปนอยางดี เราสามารถที่จะกําหนดตําแหนงของ component ในจุดตาง ๆ
ของ container ไดอยางงาย ๆ
346
บทที่ 11: GUI และ Event Handling
BorderLayout.NORTH BorderLayout.EAST
BorderLayout.CENTER
JButton JTextField
setLayout(new BorderLayout());
add(clearButton, BorderLayout.CENTER);
add(northOutput, BorderLayout.NORTH);
add(southOutput, BorderLayout.SOUTH);
add(leftButton, BorderLayout.WEST);
add(rightButton, BorderLayout.EAST);
ในการฟงเหตุการณที่อาจเกิดขึ้นในโปรแกรมตัวอยางของเรานั้น เราตองตรวจสอบดูวาระหวาง
ปุมสามปุม ปุมไหนถูกกด (ทําใหเกิด action event) โดยเราตองตรวจสอบเหตุการณเหลานี้ใน
347
เริ่มตนการเขียนโปรแกรมดวย Java
if(e.getSource() == rightButton) {
//set default locale to US
Locale.setDefault(new Locale("us", "US"));
//set date and time format with a given locale above
dateFormatter = DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.SHORT);
//get today's date
today = new Date();
dateOut = dateFormatter.format(today);
348
บทที่ 11: GUI และ Event Handling
1: /**
2: Date and Time with Border Layout
3: */
4:
5: import javax.swing.*;
6: import java.awt.*;
7: import java.awt.event.*;
8: import java.util.*;
9: import java.text.*;
10:
11: class BorderLayoutApp {
12: public static void main(String[] args) {
13: JFrame.setDefaultLookAndFeelDecorated(true);
14: JFrame frame = new DateAndTimeFrame();
15: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
16: frame.setVisible(true);
17: }
18: }
19:
20: class DateAndTimeFrame extends JFrame {
21: private static final int WIDTH = 400;
22: private static final int HEIGHT = 110;
23:
24: //create a frame and a panel
25: public DateAndTimeFrame() {
26: setTitle("Date and Time");
27: setSize(WIDTH, HEIGHT);
28: JPanel panel = new DateAndTimePanel();
29: add(panel);
30: }
31: }
32:
33: class DateAndTimePanel extends JPanel implements ActionListener {
34: protected JButton leftButton, rightButton, clearButton;
35: protected JTextField northOutput, southOutput;
36:
37: public DateAndTimePanel() {
38: //get image icon for the button
39: ImageIcon clockIcon = createImageIcon("clock.gif");
40: //create a button
41: rightButton = new JButton("US Time", clockIcon);
42: //set text position before icon
43: rightButton.setVerticalTextPosition(AbstractButton.CENTER);
44: rightButton.setHorizontalTextPosition(AbstractButton.LEADING);
45: //alt/u key activation
349
เริ่มตนการเขียนโปรแกรมดวย Java
46: rightButton.setMnemonic(KeyEvent.VK_U);
47: //add a listener to this button
48: rightButton.addActionListener(this);
49:
50: //create a button
51: leftButton = new JButton("TH Time", clockIcon);
52: //set text position before icon
53: leftButton.setVerticalTextPosition(AbstractButton.CENTER);
350
บทที่ 11: GUI และ Event Handling
120: }
121:
122: if(e.getSource() == rightButton) {
123: //set default locale to US
124: Locale.setDefault(new Locale("us", "US"));
125: //set date and time format with a given locale above
126: dateFormatter = DateFormat.getDateTimeInstance(
127: DateFormat.LONG, DateFormat.SHORT);
JPanel ใช
BorderLayout เพื่อวาง
JTextField และ JPanel
JTextField สําหรับแสดงผล
(BorderLayout.NORTH)
ภาพที่ 11.4 การจัดวาง component ดวย Grid layout และ Border layout
351
เริ่มตนการเขียนโปรแกรมดวย Java
ระหวางการสรางปุมเราก็ทําการเพิ่มความสามารถในการฟงเหตุการณใหกับปุมตาง ๆ หากมีการ
กดเกิดขึ้นเหมือนเชนที่เราทํากอนหนานี้
//handle + or -
if(action.equals("\261")) {
String s = screen.getText();
if(s.startsWith("-")) {
screen.setText(s.substring(1));
}
else
screen.setText("-" + s);
return;
}
//handle fraction
if(action.equals(".")) {
if(overWrite) {
screen.setText(action);
overWrite = false;
return;
}
String s = screen.getText();
if(s.indexOf('.') != -1)
return;
s += '.';
352
บทที่ 11: GUI และ Event Handling
screen.setText(s);
}
//handle digits 0 - 9
if(action.equals("0") || action.equals("1") || action.equals("2") ||
action.equals("3") || action.equals("4") || action.equals("5") ||
action.equals("6") || action.equals("7") || action.equals("8") ||
action.equals("9")) {
//handle operators
if(action.equals("+") || action.equals("-") ||
action.equals("*") || action.equals("/") || action.equals("=")) {
reg2 = Double.parseDouble(screen.getText());
reg1 = calc(op, reg1, reg2);
screen.setText("" + reg1);
op = action;
overWrite = true;
}
//handle x square
if(action.equals("x\262")) {
double result = Double.parseDouble(screen.getText());
result *= result;
screen.setText(String.valueOf(result));
}
}
1: /**
2: Simple calculator
3: */
4:
5: import javax.swing.*;
6: import java.awt.*;
7: import java.awt.event.*;
8: import java.util.*;
9: import java.text.*;
10:
11: class SimpleCalculator {
12: public static void main(String[] args) {
13: JFrame.setDefaultLookAndFeelDecorated(true);
14: JFrame frame = new CalculatorFrame();
15: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
16: frame.setVisible(true);
17: }
18: }
19:
20: class CalculatorFrame extends JFrame {
21:
22: //create a frame and a panel
23: public CalculatorFrame() {
24: setTitle("Simple Calculator");
25: JPanel panel = new CalculatorPanel();
26: add(panel);
27: pack();
28: }
29: }
30:
31:
32: class CalculatorPanel extends JPanel implements ActionListener {
353
เริ่มตนการเขียนโปรแกรมดวย Java
354
บทที่ 11: GUI และ Event Handling
107: if(action.equals(".")) {
108: if(overWrite) {
109: screen.setText(action);
110: overWrite = false;
111: return;
112: }
113: String s = screen.getText();
114: if(s.indexOf('.') != -1)
[การกําหนดการทํางานของปุมในเครือ
่ งคิดเลข]
355
เริ่มตนการเขียนโปรแกรมดวย Java
เนื่องจากวาเราตองดักฟงเหตุการณที่เกิดจากการกดปุม พรอมกับการสงสิ่งที่ปุมที่ถูกกดจากผูใช
ไปยัง text field เพื่อแสดงผล เราตองกําหนดให text field คอยฟงเหตุการณจาก keyboard
ดวย
screen.addKeyListener(this);
356
บทที่ 11: GUI และ Event Handling
if(overWrite) {
screen.setText("" + c);
overWrite = false;
return;
}
String s = screen.getText();
if(s.indexOf('.') != -1)
return;
JRadioButton JComboBox
JPanel:
topPanel ที่ใช
เก็บ
JRadioButton 2
ตัว
us = new JRadioButton("US");
us.setMnemonic(KeyEvent.VK_U);
us.setActionCommand("US");
357
เริ่มตนการเขียนโปรแกรมดวย Java
String[] patternStrings = {
"dd MMMMM yyyy",
"dd.MM.yy",
"MM/dd/yy",
"yyyy.MM.dd G 'at' hh:mm:ss z",
"EEE, MMM d, ''yy",
"h:mm a",
"H:mm:ss:SSS",
"K:mm a,z",
"yyyy.MMMMM.dd GGG hh:mm aaa"
};
topPanel.add(radioPanel);
topPanel.add(patterns);
358
บทที่ 11: GUI และ Event Handling
add(topPanel, BorderLayout.CENTER);
add(result, BorderLayout.SOUTH);
359
เริ่มตนการเขียนโปรแกรมดวย Java
Code ทั้งหมดของโปรแกรมตัวอยางก็มีดังนี้
1
ผูอานควรศึกษาเพิ่มเติมจาก Java API ถึงการใชงานตัวอักษรตาง ๆ ในตาราง
360
บทที่ 11: GUI และ Event Handling
1: /**
2: Using JRadioButton, JComboBox and BorderFatory
3: */
4:
5: import javax.swing.*;
6: import javax.swing.border.*;
7: import java.awt.*;
361
เริ่มตนการเขียนโปรแกรมดวย Java
73: "dd.MM.yy",
74: "MM/dd/yy",
75: "yyyy.MM.dd G 'at' hh:mm:ss z",
76: "EEE, MMM d, ''yy",
77: "h:mm a",
78: "H:mm:ss:SSS",
79: "K:mm a,z",
80: "yyyy.MMMMM.dd GGG hh:mm aaa"
362
บทที่ 11: GUI และ Event Handling
เราเริ่มตนดวยการสราง JCheckBox 3 ตัวชื่อ words, vowels และ spaces และ JPanel 1 ตัวที่
ใชเก็บ check box ทั้งสามตัวชื่อ cbPanel ดวยการกําหนดใหเปน grid layout: 3 x 1
363
เริ่มตนการเขียนโปรแกรมดวย Java
add(leftPanel);
add(scrollPane);
addWindowListener(new WindowAdapter() {
public void windowActivated(WindowEvent e) {
panel.area.requestFocusInWindow();
}
});
โดยที่ panel เปน JPanel หลักที่ใชเก็บ component ตาง ๆ และ area เปน JTextArea ที่เราให
ความสนใจ เราจึงเรียกใช method requestFocusInWindow() บน area ที่อยูใน panel นี้
364
บทที่ 11: GUI และ Event Handling
if(e.getSource() == ok) {
if(words.isSelected())
wdCount.setText("" + counts[0]);
else
wdCount.setText("");
if(vowels.isSelected())
vwCount.setText("" + counts[1]);
else
vwCount.setText("");
if(spaces.isSelected())
spCount.setText("" + counts[2]);
else
spCount.setText("");
}
if(e.getSource() == exit) {
System.exit(0);
}
}
เราไมจําเปนทีต
่ องใชปุม OK เปนตัวกําหนดการประมวลผลในโปรแกรม CountWords.java ก็ได
เราอาจใหมีการประมวลผลทันทีทผ ี่ ูใชเลือก check box ตัวใดตัวหนึ่ง ซึ่งในการกระทําดังกลาว
เราตองเปลี่ยน code ภายใน method actionPerformed() ใหทาํ การตรวจสอบการเลือกของ
check box ทันทีโดยไมตองตรวจสอบการกดปุม วิธีการก็งายมาก เพียงแคเอา code ที่วา
365
เริ่มตนการเขียนโปรแกรมดวย Java
if(e.getSource() == ok) {
366
บทที่ 11: GUI และ Event Handling
367
เริ่มตนการเขียนโปรแกรมดวย Java
140: }
141:
142: //performs action
143: public void actionPerformed(ActionEvent e) {
144: //gets sentences from JTextArea
145: String list = area.getText();
146: //array to store each count
147: int[] counts = new int[3];
368
บทที่ 11: GUI และ Event Handling
if(e.getSource() == exit) {
int status = JOptionPane.showConfirmDialog(null, "Are you sure?");
369
เริ่มตนการเขียนโปรแกรมดวย Java
fahSlider.setValue(0);
fahSlider.addChangeListener(this);
if(s == fahSlider) {
temp = fahSlider.getValue();
celSlider.setValue((int)((temp - 32) / 1.8));
}
else {
temp = celSlider.getValue();
fahSlider.setValue((int)((temp * 1.8) + 32));
}
}
1: /**
2: Using JSlider and ChangeListener
3: */
4:
5: import javax.swing.*;
6: import javax.swing.border.*;
7: import javax.swing.event.*;
8: import java.awt.*;
9: import java.awt.event.*;
10:
11: class TempConversion {
12: public static void main(String[] args) {
13: JFrame.setDefaultLookAndFeelDecorated(true);
14: JFrame frame = new SliderFrame();
15: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
16: frame.setVisible(true);
17: }
18: }
19:
20: class SliderFrame extends JFrame implements ChangeListener {
21: JLabel celTitle; //Celcius tttle
22: JLabel fahTitle; //Fahrenheit title
23: JSlider celSlider;//Celsius's slider
24: JSlider fahSlider;//Fahenheit's slider
25: JPanel titlePanel;//panel for titles
26: JPanel tempPanel; //panel for sliders
27: private final int WIDTH = 300, HEIGHT = 480;
28: private final int MIN_FAH = -40, MAX_FAH = 120;
29:
30: public SliderFrame() {
31: setTitle("Temperature Conversion");
32: setSize(WIDTH, HEIGHT);
33: setLayout(new BorderLayout());
34:
35: //creates titles and panel
36: celTitle = new JLabel("Celsius");
37: celTitle.setHorizontalAlignment(JLabel.CENTER);
370
บทที่ 11: GUI และ Event Handling
[การใช JSpinner]
371
เริ่มตนการเขียนโปรแกรมดวย Java
หรือ
JSpinner spinner;
spinner = new JSpinner(new SpinnerNumberModel(START, MIN, MAX, 1));
value = (Integer)spinner.getValue();
ทั้งนี้เราตองเปลี่ยนคาทีส
่ งกลับใหเปนไปตามคาที่เราตองการใช เนื่องจากวา getValue() จะสง
Object กลับออกมา
1: /**
2: Using JSpinner
3: */
4:
5: import javax.swing.*;
6: import javax.swing.border.*;
7: import javax.swing.event.*;
8: import java.awt.*;
9: import java.awt.event.*;
10:
11: class TempConversion2 {
12: public static void main(String[] args) {
13: JFrame.setDefaultLookAndFeelDecorated(true);
14: JFrame frame = new SpinnerFrame();
15: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
16: frame.setVisible(true);
17: }
18: }
19:
372
บทที่ 11: GUI และ Event Handling
373
เริ่มตนการเขียนโปรแกรมดวย Java
ถาเราตองการใหมีการแสดงความคืบหนาเราใช
progressBar.setStringPainted(true);
progressBar.setMaximum(1000);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
374
บทที่ 11: GUI และ Event Handling
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
progressBar.setMaximum(1000);
Code ทั้งหมดของโปรแกรมมีดังนี้
1: /**
2: Using JProgressBar
3: */
4:
5: import java.awt.*;
6: import java.awt.event.*;
7: import javax.swing.*;
8: import javax.swing.Timer;
9: import javax.swing.event.*;
10: import javax.swing.border.*;
11:
12: public class SimulatedTask extends JPanel {
13: private JProgressBar progressBar;
14: private JButton start;
15: private Timer timer;
16: private JTextField showText;
17: private Activity activity;
18:
19: public SimulatedTask() {
20: super(new BorderLayout());
21:
22: showText = new JTextField(10);
23: showText.setHorizontalAlignment(JTextField.CENTER);
24: showText.setFont(new Font("Dialog", Font.BOLD, 12));
25: showText.setEditable(false);
26:
27: start = new JButton("Start");
28:
29: progressBar = new JProgressBar();
375
เริ่มตนการเขียนโปรแกรมดวย Java
30: progressBar.setBorder(
31: BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
32: progressBar.setStringPainted(true);
33:
34: JPanel panel = new JPanel(new GridLayout(1, 2, 2, 2));
35: panel.add(start);
36: panel.add(showText);
37:
376
บทที่ 11: GUI และ Event Handling
[ProgressMonitor]
JDialog.setDefaultLookAndFeelDecorated(true);
377
เริ่มตนการเขียนโปรแกรมดวย Java
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
activity = new Activity(1000);
thread = new Thread(activity);
thread.start();
progressDialog.setMillisToDecideToPopup(SECOND);
timer.start();
start.setEnabled(false);
}
});
1: /**
2: Using ProgressMonitor
3: */
4:
5: import java.awt.*;
6: import java.awt.event.*;
7: import javax.swing.*;
8: import javax.swing.Timer;
378
บทที่ 11: GUI และ Event Handling
9: import javax.swing.event.*;
10: import javax.swing.border.*;
11:
12: public class SimulatedTask2 extends JPanel {
13: private ProgressMonitor progressDialog;
14: private JButton start;
15: private Timer timer;
16: private JTextField showText;
379
เริ่มตนการเขียนโปรแกรมดวย Java
83: });
84: }
85:
86: //creates and show GUI
87: private static void setGUI() {
88: //set frame to java look and feel
89: JFrame.setDefaultLookAndFeelDecorated(true);
90: //set look and feel of ProgressMonitor
380
บทที่ 11: GUI และ Event Handling
JMenu
JMenuItem
เรากําหนดใหมต ี ัวเลือกใน menu อยูสี่ตวั คือ New, Open, Save และ Exit โดยกําหนดให
Open และ Save มีการใช icon แสดงถึงงานที่ตัวเลือกนีท ้ ํา การสราง menu นี้เราใช JMenuBar
เปนตัวสราง สวนหัวของ menu ใช JMenu และตัวเลือกภายในเราใช JMenuItem เปน
ตัวกําหนด
381
เริ่มตนการเขียนโปรแกรมดวย Java
catch(IOException ioex) {}
}
}
});
return item;
}
fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
382
บทที่ 11: GUI และ Event Handling
เราเพียงแตสราง menu item บน menu bar ใหเปน icon แลวก็เพิ่ม code สําหรับการ
สนองตอบของผูใช (เมื่อปุมถูกกด) เชนเดียวกันกับที่เราไดทําการสนองตอบของ Open ที่มีอยู
ใน menu พรอมกันนี้เรายังไดกําหนดใหขนาดของ tab ใน text area ของเรามีคาเทากับ 2
ตัวอักษรดวยคําสั่ง area.setTab(2)
383
เริ่มตนการเขียนโปรแกรมดวย Java
1: /**
2: Using JFileChooser, JMenu, JMenuBar, JMenuItem
3: files used:
4: open.gif
5: save.gif
384
บทที่ 11: GUI และ Event Handling
385
เริ่มตนการเขียนโปรแกรมดวย Java
386
บทที่ 11: GUI และ Event Handling
และเราก็เปลีย
่ นการเพิ่ม component เขาสู menu ใหเปน
file.add(exitAction);
Pop-up menu เปน menu ทีไ ่ มไดผูกติดกับ menu bar เชนที่เราทํากอนหนานี้ แตจะเปน
menu ที่โผลขน
ึ้ มาเมื่อผูใช activate
เมื่อสราง pop-up menu เสร็จการทีจ ่ ะให component ใด ๆ มี pop-up menu ดวยนั้น เชน
จากโปรแกรมตัวอยาง เราตองการที่จะให pop-up menu เกิดขึ้นเมื่อผูใชกดปุมขวาบน mouse
ในพื้นที่ของ text area เราก็ใชคําสั่ง
area.setComponentPopupMenu(addPopup());
387
เริ่มตนการเขียนโปรแกรมดวย Java
item.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_O, InputEvent.CTRL_MASK));
กับ menu item ที่เราตองการ แคนี้เราก็สามารถใช CTRL+O เพื่อเปด dialog window สําหรับ
การเลือกไฟลที่จะเปดโดยไมตองเปด menu
saveItem.setEnabled(false);
saveItem.setEnabled(true);
388
บทที่ 11: GUI และ Event Handling
11.7.4 JToolBar
contentPane.add(bar, BorderLayout.PAGE_START);
389
เริ่มตนการเขียนโปรแกรมดวย Java
openAction.putValue(Action.SHORT_DESCRIPTION, "Open");
saveButton.setToolTipText("Save");
toolbar.setFloatble(false);
เราจะลองสรางโปรแกรมตัวอยางทีท
่ ําการเปลีย
่ นหนวยการวัดจากระบบ Metric ไปสูระบบ US
(หรือจาก US ไปเปน Metric) โดยเราจะกําหนดใหมีการใช component ดังนี้คือ
1. JTextField 2 ตัว
2. JRadioButton 3 ตัว (พรอมกับ ButtonGroup อีกหนึ่งตัว)
3. JScrollBar 2 ตัว
4. JComboBox 2 ตัว
5. JPanel 2 ตัว
โดยใหโปรแกรมมีหนาตาดังนี้
390
บทที่ 11: GUI และ Event Handling
1. เลือก File Æ New Project ภายใต Categories เลือก General ภายใต Project เลือก
Java Application แลวจึงกดปุม Next
2. ภายใต Project Name ใหใส conversion สําหรับ Project Location ก็ใหเลือกแฟมที่
เราตองการเก็บ project เชน D:\NetbeansProjects และภายใต Project Folder ก็ให
เปนไปตามคาที่มาจาก Netbeans เอง (D:\NetbeansProjects\conversion)
3. สวนที่เหลืออื่น ๆ ก็ใหเปนไปตามที่ Netbeans กําหนดหรือถาตองการกําหนด
package สําหรับ Main class ใหเปนอยางอืน ่ เชน ที่เราใชก็ใส
edu.fec.it.conversion.Main (เพราะวาเราเปนภาควิชา it ที่ fec.edu)
4. กดปุม Finish
Palette
391
เริ่มตนการเขียนโปรแกรมดวย Java
1. จาก Component Palette ทางดานขวาของ IDE ลาก JPanel เขาสู Form โดยลากไป
ทางดานซายบนจนกวาจะเห็นเสนประสองเสน ทางดานบนและทางซาย ซึง่ เสนประทั้ง
สองเปนตัวชวยในการวาง component (ที่ GroupLayout manager2 ใช) กําหนดให
ขนาดของ JPanel มีขนาดประมาณครึ่งหนึ่งของ Form หลังจากนั้นก็สราง JPanel อีก
หนึ่งตัววางไวทางขวาของตัวแรก
2. เพื่อใหทั้งสอง JPanel มีขนาดที่เทากับเราก็เลือก JPanel ตัวหนึ่ง (เชนตัวทางซาย)
กดปุม Shift แลวจึงเลือก JPanel ทางขวา Æ กดปุมขวาบน mouse เลือก Same Size
แลวจึงเลือก Same Width
3. ถึงแมวาเราไดสราง JPanel 2 ตัวแลวแตเราก็มองไมเห็น นอกเสียจากวาเราจะนํา
mouse ไปวางบน JPanel ทั้งสอง (JPanel เปน container ที่ใชจัดเก็บ component
อีกทีหนึ่ง) และเพื่อใหมองดูแลวสวยงามเราก็จะสราง border ใหกับ JPanel ทั้งสอง
4. เลือก JPanel ตัวใดตัวหนึ่ง (เราไมไดเปลี่ยนแปลงสิ่งที่ Netbeans กําหนดดังนั้นชื่อ
ของ component ก็จะเปน jPanel1 และ jPanel2) เมื่อเราเลือก jPanel1 เราก็จะเห็น
Properties windows ทางดานขวาลางของ Netbeans (ถัดจาก Palette) ภายใต
border properties กดปุม … เลือก TitledBorder ภายใต Title ใส Metric System ใน
สวนของ Border กดปุม … เลือก LineBorder พรอมกับ check ชอง Rounded
Corners กดปุม OK 2 ครั้ง
5. ทําอยางเดียวกันนี้กับ jPanel2 ดวยชื่อ border เปน US System
2
Netbeans 5.0 โดย Matisse ใช GroupLayout manager เปนตัวจัดวาง component
392
บทที่ 11: GUI และ Event Handling
393
เริ่มตนการเขียนโปรแกรมดวย Java
public ConversionForm() {
initComponents();
allocateSpace();
distanceInit();
}
394
บทที่ 11: GUI และ Event Handling
เราสรางเอง
395
เริ่มตนการเขียนโปรแกรมดวย Java
396
บทที่ 11: GUI และ Event Handling
เราตองไมลืมวาผูใชตองกดปุม
Enter กอนการสนองตอบเหลานี้จึงเกิดขึ้น สวนสําคัญที่เราตอง
ทําตอไปก็คอื เปลี่ยนขอมูลทีผ
่ ูใชใสเขามาใหเปนอีกหนวยหนึ่งใน jTextField2 โดยกําหนดให
เรียก method actionMtoU()
397
เริ่มตนการเขียนโปรแกรมดวย Java
398
บทที่ 11: GUI และ Event Handling
Code ที่อยูภ
ายในก็ไมมีอะไรซับซอนเราแคดึงคาออกจาก jScrollBar1 สงออกไปยัง
jTextField1 เรียกใช method actionMtoU() ดวยคาใน jScrollBar1 นี้คาในสวนอื่น ๆ ที่มีการ
ดักจับเหตุการณก็จะทําหนาทีใ่ นการเปลี่ยนคาตามที่ตัวเองรับผิดชอบ
399
เริ่มตนการเขียนโปรแกรมดวย Java
โปรแกรมตัวอยางที่เราแสดงใหดูเปนตัวอยางงาย ๆ ที่แสดงใหเห็นถึงความสามารถของ
Netbeans ในการสราง GUI ทีม ่ ีหนาตาดูแลวสวยงาม ใชเวลานอยในการสราง (ไมเหมือนกับ
การสรางดวยการเขียน code เชนทีท่ ํากอนหนานี้) ผูอานสามารถลดเวลาในการพัฒนาโปรแกรม
ที่มีความซับซอนลงไดอยางมาก ทําใหมีเวลาในการพัฒนาสวนที่เปน logic ของโปรแกรมมาก
ขึ้น
ภาพที่ 11.31 dist folder และไฟลที่อยูภายใน (มองผาน Files tab ของ Netbeans)
ขั้นตอนสั้น ๆ เพียงเทานี้กท
็ ําใหเราสามารถที่จะ run โปรแกรมที่เราสรางขึ้นจาก Netbeans ใน
ที่อื่น ๆ ที่ไมใชภายใน IDE ได
400
บทที่ 11: GUI และ Event Handling
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
401
เริ่มตนการเขียนโปรแกรมดวย Java
[ใสลูกเลนใหกับโปรแกรม conversion]
เราอยากทีจ
่ ะใหโปรแกรม conversion ของเรามีการแสดงเวลาขณะที่โปรแกรมกําลัง run อยู
ทางดานขวาลางของ form เชนที่เห็นจากภาพนี้
402
บทที่ 11: GUI และ Event Handling
6. กดปุม OK
7. ทําแบบเดียวกันนี้กับ Weight และ Temperature
403
เริ่มตนการเขียนโปรแกรมดวย Java
เราก็จะไดหนาตางที่มภ
ี าษาไทยใน JRadioButton แทนภาษาอังกฤษดังทีไ
่ ดแสดงใหดูกอ
น
หนานี้
[กําหนดการใชภาษาไทยในขณะที่โปรแกรมกําลัง execute]
ตัวอยางการใชภาษาไทยในตัวอยางกอนหนานี้เปนการทําในชวงเวลาของการออกแบบ (เขียน)
โปรแกรม ซึ่งสวนใหญจะเปนการเปลี่ยนคาของ string ที่แสดงขอความสื่อถึงผูใ ชในรูปแบบตาง
ๆ ในบางครั้งเราตองการกําหนดคาของ string เหลานี้ ณ เวลาที่โปรแกรมกําลัง execute อยู
เชน กําหนดคาของขอมูลใน combo box ดังที่เราทําในโปรแกรม conversion
404
บทที่ 11: GUI และ Event Handling
405
เริ่มตนการเขียนโปรแกรมดวย Java
ทุกครั้งทีผ
่ ูใชกดปุม (ซึ่งอาจเปน "Thai" หรือ "English") เราก็จะดึงเอาคาที่อยูบนปุมออกเพื่อ
ตรวจสอบวาเราตองกําหนดขอมูลใน combo box วาควรเปนภาษาไทยหรือภาษาอังกฤษ และ
เมื่อไดแลวเราก็เรียกใช properties ที่เราเขียนขึ้นผานทาง resource bundle เชน
Java ก็จะไปคนหา properties ไฟลที่ขึ้นตนดวย Months ตามดวย locale: th_TH หรือ en_US
ที่เราไดกําหนดไวจากการเรียก หลังจากนั้น (ถาหาไฟลเจอ) เราก็ทําการกําหนดคาใหกับ
combo box ดวย
jComboBox1.removeAllItems();
jComboBox1.addItem(f.getString("Jan"));
โดยเราเริม
่ ตนดวยการลบคาเกาที่อยูออกกอน หลังจากนั้นจึงทําการใสขอมูลที่ดึงออกมาจาก
properties ไฟลตามคาของ key ผานทาง method getString() ของ resource bundle
เราจะเริ่มตนขั้นตอนดังนี้
406
บทที่ 11: GUI และ Event Handling
407
เริ่มตนการเขียนโปรแกรมดวย Java
408
บทที่ 11: GUI และ Event Handling
เราก็จะไดผลลัพธคลาย ๆ กับที่เห็นนี้
Netbeans เปนเครื่องมือที่ดที ส
ี่ ุดตัวหนึ่งในการพัฒนาโปรแกรมทีต
่ องใช UI ในการโตตอบกับ
ผูใช โปรแกรมตัวอยางที่เราแสดงใหดูเปนโปรแกรมเล็ก ๆ ทีแ่ สดงถึงการใช UI component
ตาง ๆ (บางสวน) ที่ Netbeans มีให ผูอานควรฝกฝนการใช Netbeans ในการสรางโปรแกรมอื่น
ๆ เพื่อใหเกิดความคลองตัวและสามารถใช Netbeans ไดอยางมีประสิทธิภาพตอไป
สรุป
แบบฝกหัด
409
เริ่มตนการเขียนโปรแกรมดวย Java
410