G II THI UV SWING

Một phần của tài liệu Lập trình hướng đối tượng Java PTIT (Trang 148)

L P TRÌNH GIAO DIN TRÊN JAVA

6.5 G II THI UV SWING

Swing là th vi n l p trình m r ng c a Java. Nó m r ng các đ i t ng giao di n đ ho c b n c a Java. Swing còn đ c g i là th vi n JFC (Java Foundation Class). Khi mu n s d ng các đ i t ng đ ho c a th vi n này, ta ph i khai báo ch th :

import javax.swing.*;

6.5.1 M r ng các đ i t ng component

JFC m r ng các đ i t ng c b n c a java thành các l p t ng ng, ngoài tr vi c có thêm ch “J” đ u m i tên l p: Button å JButton Label å JLabel TextField å JTextField TextArea å JTextArea Checkbox å JCheckbox List å JList

Menu å JMenu

Các l p m r ng này có đ y đ các ph ng th c c a các đ i t ng l p c b n c a th vi n java.awt. Ngoài ra, chúng đ c b sung m t s ph ng th c t o hi u ng giao di n.

Ch ng trình 6.20 minh ho vi c s d ng đ i t ng JButton. i t ng JButton đ c m r ng thêm m t s tính n ng sau:

• JButton(String, Icon): Kh i t o m t nút nh n v i m t tên nhãn và m t nh n n. nh n n có ki u icon (tham s th hai).

• setMnemonic(char): nh phím t t cho nút l nh. Khi ng i dùng nh n “Ctrl+phím t t” thì nút l nh c ng th c thi t ng t nh kkhi ta click chu t vào nút l nh.

• setBorder(new MatteBorder(int, int, int, int, Icon)): Thi t l p khung n n cho nút v i các tham s : Kho ng cách t ch đ n biên (đ r ng biên) theo các chi u trên d i, trái ph i, cu i cùng là nh n n cho nút.

• setBorder(new LineBorder(int)): Thi t l p vi n cho nút d ng hình ch nh t, tham s xác

đnh màu cho vi n c a nút. Ngoài ra, tham s c a ph ng th c này còn có th là các l p SoftBevelBorder, EtchedBorder và TitleBorder.

• setToolTipText(String): Thi t l p dòng tooltip cho đ i t ng. Dòng này s hi n ra khi ta di chu t lên đ i t ng trên c a s .

Ch ng trình 6.20

package vidu.chuong6; import javax.swing.*;

public class JButtonDemo extends JFrame{ public static void main(String[] args) {

// Khai báo và kh i t o frame có tiêu đ

JFrame myFrame = new JFrame(“Frame has somes buttons!”); myFrame.setSize(300,150); // nh kích c frame

// Gi s ta có file nh myImage trong cùng th m c Icon myIcon = new ImageIcon(“myImage.gif”);

// Button1: có n n là nh

JButton btn1 = new JButton(“Back Image”, myIcon); // Gán tooltip cho nút

btn1.setToolTipText(“Button’s background is an image”); myFrame.getContentPane().add(btn1); // G n vào frame

// Button2: có biên là nh

JButton btn2 = new JButton(“Border Image”); // Gán tooltip cho nút

btn1.setToolTipText(“Button’s border is an image”); btn2.setBorder(new MatteBorder(10,10,10,10, myIcon)); myFrame.getContentPane().add(btn2); // G n vào frame

myFrame.setVisible(true); // Hi n th frame }

}

Trong ch ng trình này, có dòng l nh g n các đ i t ng vào frame b ng cách getContentPane(). ây là ph ng th c m r ng cho các đ i t ng khung ch a container. S m r ng này s đ c trình bày chi ti t trong ph n ti p theo.

6.5.2 M r ng các đ i t ng container

T ng t nh các đ i t ng component, các đ i t ng container c ng đ c m r ng trong JFC thành các l p có tên t ng ng và thêm kí t “J” đ u:

Frame å JFrame Panel å JPanel Dialog å JDialog

Ch ng trình 6.21 minh ho vi c s d ng các đ i t ng m r ng c a khung ch a Frame thành JFrame. Khung ch a JFrame có nhi u t ng trình di n khác nhau, các t ng là trong su t và ch ng khít lên nhau, khi n cho ta v n có c m giác các đ i t ng đ c trình bày trên cùng m t m t ph ng nh khung ch a Frame c a th vi n chu n AWT.

M t s t ng hay s d ng c a l p JFrame (theo th t t trong ra ngoài):

• ContentPane: Là t ng th ng dùng nh t, t ng này dùng đ ch a các đ i t ng component c b n nh button, label, text, list…

• MenubarPane: T ng dành đ ch a các lo i menu c a frame nh Menubar, PopupMenu. • GlassPane: T ng ngoài cùng, th ng dùng đ ch a các tooltip c a các đ i t ng trong

t ng Content. Khi ta set tooltipText cho m t đ i t ng, tooltip đó s t đ ng đ c add vào t ng Glass.

truy nh p vào m t t ng b t kì, ta dùng ph ng th c có tên: get + <Tên c a t ng>();

Ví d :

JFrame myFrame = new JFrame(“My JFrame”);

myFrame.getContentPane().add(“Center”, new JButton(“Test”)); s g n m t nút nh n có nhãn Test vào t ng Content c a khung ch a myFrame. Ch ng trình 6.21 minh ho vi c g n các đ i t ng vào các t ng khác nhau:

• G n m t nút nh n vào t ng ContentPane.

• G n m t thanh Menubar có ch a m t menu File vào t ng MenubarPane.

Ch ng trình 6.21

package vidu.chuong6; import javax.swing.*; import java.awt.event.*;

private JMenuBar myBar; private JMenu myMenu;

public JFrameDemo(){ super(“JFrame demo”);

JButton btn = new Jbutton();

// G n nút nh n vào t ng ContentPane

this.getContentPane().add(“Center”, btn);

myBar = new JMenuBar(); myMenu = new JMenu(“File”);

myMenu.add(new JMenuItem(“Open”)); myMenu.add(new JMenuItem(“New”)); myMenu.add(new JSeparator()); myMenu.add(new JMenuItem(“Save”));

myMenu.add(new JMenuItem(“Save As”)); myMenu.add(new JSeparator());

myMenu.add(new JMenuItem(“Exit”)); myMenu.addActionListener(this); myBar.add(myMenu);

// G n menubar vào t ng MenubarPane this.getJMenuBar().add(myBar);

// Ph ng th c b t s ki n click vào nút đóng frame this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){ System.exit(0);

} }); }

/* Ph ng th c x lí s ki n */

public void actionPerformed(ActionEvent ae){ if(ae.getActionCommand().equals(“Exit”)){ System.exit(0);

} }

public static void main(String[] args) { // Khai báo và kh i t o frame có tiêu đ JFrameDemo myFrame = new JFrameDemo();

myFrame.setSize(300,150); // nh kích c frame myFrame.setVisible(true); // Hi n th frame

} }

L u ý:

Vì các đ i t ng m r ng c a th vi n JFC đ c b sung khá nhi u tính n ng, đ c bi t là các tính n ng đ ho , do đó, các đ i t ng này có nh c đi m là r t c ng k nh. Vì lí do n ng t i, cho nên hi n nay, các đ i t ng c a th vi n JFC v n ít đ c ph bi n trong các ng d ng applet.

6.6 CASE STUDY IV

Trong ph n này, ta s minh ho cách s d ng các đ i t ng đ ho c a th vi n chu n AWT đ

vi t m t ch ng trình mô ph ng m t máy tính Calculator.

• T o m t frame làm khung ch ng trình, tiêu đ là “Java Calculator”

• Phía trên là m t Label (ho c ô v n b n đ u đ c, nh ng n u dùng ô v n b n thì không cho edit) đ hi n các s đ c nh p vào và k t qu tính toán.

• Phía d i là các nút nh n t ng ng v i các ch s và phép toán. Nh ng đ nhóm các nút nh n cho đ ng b và layout đ p m t, ta nhóm chúng vào m t Panel.

• Khi đó, frame s ch a tr c ti p hai đ i t ng: label và frame. Ta s d ng layout ki u null, và xác đnh v trí chính xác cho label và panel.

• i v i Panel, ta c ng dùng GridLayout. Vì có 10 nút nh n s và các nút nh n toán t : nút c ng, nút nhân, nút chia, nút tr , nút c n b c hai, nút ph y th p phân, nút b ng, nút lu th a, nút ngh ch đ o, nút reset. Nên s t o thành 4 dòng, 5 c t: m i dòng g m có 3 nút s và hai nút ch c n ng:

- Dòng 1: các nút 7, 8, 9, c ng, reset (C). - Dòng 2: các nút 4, 5, 6, tr , lu th a. - Dòng 3: các nút 1, 2, 3, nhân, ngh ch đ o.

- Dòng 4: các nút 0, th p phân, nút b ng, nút chia, nút c n b c hai.

• V i các nút s và nút th p phân, khi click vào nút thì kí t t ng ng đ c hi n lên trên label.

• V i các nút ch c n ng, khi click vào thì th c hi n phép toán và hi n k t qu ra màn hình, n u có.

• Khi click vào nút b ng (k t qu ) thì hi n k t qu trên label. Ch ng trình 6.22 cài đ t chi ti t ch ng trình này.

Ch ng trình 6.22

package vidu.chuong6; import java.awt.*;

import java.awt.event.*; import java.lang.Math;

public class CalculatorDemo extends Frame implements ActionListener{ private boolean operatorState; // Tr ng thái c a phép toán

private float oldIterator; // S h ng tr c private Label lbl;

private Panel pnl;

private Button btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btnPoint, btnReset, btnAdd, btnSub, btnMul, btnDiv, btnPow, btnSqrt, btnRev, btnResult;

public CalculatorDemo(){ super(“Java Calculator”); this.setSize(250, 250);

this.setResizable(false); // Không cho thay đ i size this.setLayout(null); // Thi t l p layout

lbl = new Label("0"); // Nhãn k t qu lbl.setAlignment(2);

lbl.setSize(240, 30); lbl.setLocation(5, 25); this.add(lbl);

Panel pnl = new Panel(); // Panel ch a các nút pnl.setSize(240, 190);

pnl.setLocation(5, 55);

pnl.setLayout(new GridLayout(4, 5)); // Thi t l p layout this.add(pnl);

btn7 = new Button(“7”); // Nút s 7

btn7.addActionListener(this); // B t s ki n click chu t pnl.add(btn7); // G n vào panel

btn8 = new Button(“8”); // Nút s 8 btn8.addActionListener(this); pnl.add(btn8); btn9 = new Button(“9”); // Nút s 9 btn9.addActionListener(this); pnl.add(btn9);

btnAdd = new Button(“+”); // Nút phép toán c ng btnAdd.addActionListener(this);

pnl.add(btnAdd);

btnReset = new Button(“C”); // Nút reset btnReset.addActionListener(this);

pnl.add(btnReset); btn4 = new Button(“4”); // Nút s 4 btn4.addActionListener(this); pnl.add(btn4); btn5 = new Button(“5”); // Nút s 5 btn5.addActionListener(this); pnl.add(btn5); btn6 = new Button(“6”); // Nút s 6 btn6.addActionListener(this); pnl.add(btn6);

btnSub = new Button(“-”); // Nút phép toán tr btnSub.addActionListener(this);

pnl.add(btnSub);

btnPow = new Button(“x^y”); // Nút phép toán lu th a btnPow.addActionListener(this); pnl.add(btnPow); btn1 = new Button(“1”); // Nút s 1 btn1.addActionListener(this); pnl.add(btn1); btn2 = new Button(“2”); // Nút s 2 btn2.addActionListener(this); pnl.add(btn2); btn3 = new Button(“3”); // Nút s 3 btn3.addActionListener(this); pnl.add(btn3);

btnMul = new Button(“*”); // Nút phép toán nhân btnMul.addActionListener(this);

pnl.add(btnMul);

btnRev = new Button(“1/x”); // Nút phép toán ngh ch đ o btnRev.addActionListener(this);

pnl.add(btnRev);

btn0.addActionListener(this); pnl.add(btn0);

btnPoint = new Button(“.”); // Nút d u th p phân btnPoint.addActionListener(this);

pnl.add(btnPoint);

btnResult = new Button(“=”); // Nút k t qu btnResult.addActionListener(this);

pnl.add(btnResult);

btnDiv = new Button(“/”); // Nút phép toán chia btnDiv.addActionListener(this);

pnl.add(btnDiv);

btnSqrt = new Button(“Sqrt”); // Nút phép toán c n b c hai btnSqrt.addActionListener(this); pnl.add(btnSqrt); operatorState = true; operator = -1; oldIterator = 0; this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);

} }); }

/* Ph ng th c x lí s ki n */

public void actionPerformed(ActionEvent ae){ float result;

float newIterator = Float.parseFloat(lbl.getText()); if(ae.getSource() == btnResult){

switch(operator){ case 0:

result = oldIterator + newIterator; lbl.setText(String.valueOf(result)); break;

case 1:

result = oldIterator - newIterator; lbl.setText(String.valueOf(result)); break;

case 2:

result = oldIterator * newIterator; lbl.setText(String.valueOf(result)); break; case 3: if(newIterator != 0){ result = oldIterator/newIterator; lbl.setText(String.valueOf(result)); } break; case 4:

result = (float)Math.pow(oldIterator, newIterator); lbl.setText(String.valueOf(result)); break; } operator = -1; operatorState = true; return; } if(ae.getSource() == btnRev){ newIterator = Float.parseFloat(lbl.getText()); if(newIterator != 0){ result = (float)1/newIterator; lbl.setText(String.valueOf(result)); } operator = -1; operatorState = true; return; } if(ae.getSource() == btnSqrt){ newIterator = Float.parseFloat(lbl.getText()); if(newIterator >= 0){ result = (float)Math.sqrt(newIterator); lbl.setText(String.valueOf(result)); } operator = -1; operatorState = true; return; } if(ae.getSource() == btnPoint){ lbl.setText(lbl.getText() + “.”); return; }

if(ae.getSource() == btnAdd){ operator = 0; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnSub){ operator = 1; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnMul){ operator = 2; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnDiv){ operator = 3; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnPow){ operator = 4; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnReset){ operator = -1; operatorState = true; oldIterator = 0; lbl.setText("0"); return; } // Tr ng h p click vào nút s if(operatorState){ // B t đ u s m i lbl.setText(ae.getActionCommand()); operatorState = false; }else // Gõ ti p s c lbl.setText(lbl.getText() + ae.getActionCommand());

}

public static void main(String[] args) { // Khai báo và kh i t o frame

CalculatorDemo myFrame = new CalculatorDemo(); myFrame.setVisible(true); // Hi n th frame }

}

Ch ng trình 6.22 s cho k t qu nh hình 6.16:

Hình 6.16: K t qu demo case study

T NG K T CH NG 6

N i dung ch ng 6 đã trình bày ph ng pháp l p trình giao di n v i các đ i t ng trong th vi n chu n AWT c a Java:

• Các đ i t ng có ch c n ng làm v t ch a cho các đ i t ng giao di n: Frame, Panel, Dialog.

• Các đ i t ng là thành ph n giao di n: Label, Button, TextField, TextArea, Checkbox, List, Menu.

• Ph ng pháp n m b t và x lí các s ki n đ c thù c a t ng đ i t ng giao di n.

• Các ph ng pháp trình bày trên các v t ch a: FlowLayout, GridLayout, BorderLayout, GridBagLayout, NullLayout.

Ch ng 6 c ng gi i thi u m t ph ng pháp l p trình giao di n Java đ c nhúng trong các trang web, đó là l p trình applet:

• Cách t o ra m t applet v i các ph ng th c c b n. • Cách nhúng m t applet vào m t trang web.

• Cách ki m nghi m m t applet sau khi nhúng vào trang web b ng các trình duy t.

Ngoài ra, ch ng này c ng gi i thi u cách s d ng th vi n các đ i t ng đ ho m r ng JFC c a Java. Các đ i t ng c a th vi n JFC có ch c n ng hoàn toàn t ng t các đ i t ng t ng ng trong th vi n chu n AWT. Ngoài ra, chúng còn đ c b sung thêm m t s kh n ng đ ho cao c p.

CÂU H I VÀ BÀI T P CH NG 6

1. Vi t ch ng trình thay đ i màu n n c a frame theo l a ch n c a ng i dùng:

• T o ra các nút nh n có tên theo các màu: Blue, Cyan, Gray, Green, Magenta, Orange, Pink, Red, White, Yellow.

• Khi click chu t vào nút nào, màu n n c a frame s đ i theo màu đó.

2. Vi t ch ng trình thay đ i màu n n trong bài 1 b ng ô v n b n. T o ra m t ô v n b n duy nh t, khi ng i dùng gõ vào m t trong s các màu trong bài 1 và gõ enter, màu n n c a frame s đ i theo màu đó. N u ng i dùng gõ sai màu, không làm gì c .

3. Vi t ch ng trình thay đ i màu n n trong bài 1 b ng nút ch n radio. T o m t nhóm các nút radio t ng ng v i các lo i màu. Khi màu nào đ c ch n, màu n n c a frame s thay

đ i theo màu đó.

4. Vi t ch ng trình thay đ i màu n n trong bài 1 b ng danh sách ch n list. T o m t List có các item t ng ng v i các lo i màu. Khi màu nào đ c ch n, màu n n c a frame s thay

đ i theo màu đó.

5. Vi t ch ng trình thay đ i màu n n trong bài 1 b ng menu. T o m t menubar, trên đó có g n m t menu tên là color, khi click chu t vào mune color, s s xu ng các màu t ng

ng trong bài 1. Khi màu nào đ c ch n, màu n n c a frame s thay đ i theo màu đó. 6. Vi t ch ng trình thay đ i màu n n trong bài 1 b ng menu popup. T o m t menu popup

trong frame, khi click chu t ph i lên frame, s hi n ra menu g m các màu t ng ng trong bài 1. Khi màu nào đ c ch n, màu n n c a frame s thay đ i theo màu đó.

7. Vi t l i các ch ng trình trong các bài t p 1 đ n 6 d i d ng applet và nhúng chúng vào trang myHtml.htl đ ch y. (Trang này ph i cùng th m c v i các l p v a cài đ t và biên d ch).

H NG D N TR L I CÂU H I VÀ BÀI T P Ch ng 1 Không có bài t p. Ch ng 2 1. áp án: a. úng. b. úng. c. úng. d. úng. e. Sai. f. Sai. g. úng. h. úng. i. Sai. j. úng. k. úng. l. úng. m. úng. n. úng. 2. G i ý: Xe ô tô: Nhãn hi u xe Công su t xe Màu s c xe Giá bán xe Nh p/xem nhãn hi u xe Nh p/xem công su t xe Nh p/xem màu s c xe Nh p/xem giá bán xe 3. G i ý:

Một phần của tài liệu Lập trình hướng đối tượng Java PTIT (Trang 148)