Lập trình hướng đối tượng - Chương 5: Lập trình giao diện với Java

pptx 97 trang vanle 2550
Bạn đang xem 20 trang mẫu của tài liệu "Lập trình hướng đối tượng - Chương 5: Lập trình giao diện với Java", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptxlap_trinh_huong_doi_tuong_chuong_5_lap_trinh_giao_dien_voi_j.pptx

Nội dung text: Lập trình hướng đối tượng - Chương 5: Lập trình giao diện với Java

  1. Chương 5 Lập trình giao diện với Java TRẦN MINH THÁI Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn Cập nhật: 02 tháng 07 năm 2016
  2. Nội dung #2 1. Giới thiệu về lập trình giao diện 2. Nguyên lý xử lý sự kiện trong Java 3. Các thành phần giao diện cơ bản trong AWT 4. Tổ chức giao diện với Layout Manager 5. Lập trình Applet 6. Lập trình ứng dụng với SWING
  3. Giới thiệu về lập trình giao diện #3 Tập hợp các lớp java cung cấp hỗ trợ thiết kế, xây dựng GUI (Graphic User Interface) bao gồm 2 thư viện: • awt (java.awt.*): lớp cơ bản lập trình GUI, được phát triển bởi IBM • swing (javax.swing.*): dễ dàng và mềm dẻo hơn trong lập trình GUI
  4. Giới thiệu AWT #4 • AWT viết tắt của Abstract Windowing Toolkit • AWT là tập hợp các lớp Java cho phép chúng ta tạo một GUI. • Cung cấp các mục khác nhau để tạo hoạt động và hiệu ứng GUI – import java.awt.*; – import java.awt.event.*;
  5. Giới thiệu AWT #5 • java.awt gồm các lớp GUI cơ bản • Các lớp Container – lớp chứa (Frame, Panel, Dialog, ScollPanel) • Các lớp Component (như Button, TextComponent, Label) • Các lớp quản lý layout(FlowLayout, BorderLayout, GridLayout) • Các lớp đồ họa tùy biến(Graphics, Color, Font)
  6. Giới thiệu AWT #6 • java.awt.event gồm các lớp xử lý sự kiện trên giao diện • Các lớp sự kiện (ActionEvent, MouseEvent, KeyEvent và WindowEvent) • Các giao diện nghe sự kiện(MouseListener, KeyListener ) • Các lớp Adapter (MouseAdapter, KeyAdapter)
  7. AWTEvent Container Panel Applet #7 Font Button Window Frame FontMetrics Label Dialog FileDialog TextField Object Color TextComponent TextArea Graphics List Component Choice CheckBox LayoutManager CheckBoxGroup Canvas MenuComponent MenuItem Menu MenuBar Scrollbar
  8. Nguyên tắc xây dựng GUI #8 1. Lựa chọn một container: Frame, Window, Dialog, Applet, 2. Tạo các control: (buttons, text areas, list, choice, checkbox, ) 3. Đưa các control vào vùng chứa 4. Sắp xếp các control trong vùng chứa (Layout) 5. Thêm các xử lý sự kiện (Listeners)
  9. Container và Component #9 • Container: chứa các component, có thể vẽ và tô màu • Bản thân container cũng là một component • Một container có thể chứa các container khác • Phương thức add(Component): thêm một component vào container • Component: là đối tượng cơ bản tạo nên giao diện • Cho phép người dùng tương tác với chương trình
  10. Ví dụ #10
  11. Toạ độ #11 y screen x screen height MyWindow height width screen width
  12. Top-level Container #12 • Frame • Dialog • Applet
  13. Top-level Container #13 • Frame: cửa sổ chính của giao diện chương trình • Xây dựng cửa sổ chương trình bằng cách kế thừa lớp Frame hoặc kết tập 1 đối tượng Frame • Kế thừa để sử dụng ngay các thành viên của Frame • Dialog: cửa sổ pop-up được sử dụng để tạo ra các tương tác nằm ngoài cửa sổ chính • Applet: sử dụng trên xây dựng chương trình chạy trên trình duyệt Web
  14. Secondary Containers #14 • Panel: khung chữ nhật nằm trong một top-level container, được sử dụng để tạo layout cho chương trình • ScrollPane: tạo ra hiệu ứng cuộn chuột (ngang/dọc) cho một component
  15. Xử lý sự kiện #15 • Người dùng tương tác với chương trình qua giao diện • Chương trình phải nghe được các sự kiện trên giao diện để thực hiện hành động tương ứng • Ví dụ: nhập liệu, nhấn phím Enter, nhấp chuột, đóng cửa sổ,
  16. Xử lý sự kiện #16 • Tham gia sự kiện: nguồn (source) sinh sự kiện, bộ nghe sự kiện (listener), và sự kiện (event) • Nguồn (source): component phát sinh sự kiện(button, textfield ) • Mỗi nguồn sẽ đăng ký các bộ nghe sự kiện khác nhau • Khi có sự kiện nào đó xảy ra từ nguồn, phương thức xử lý sự kiện (event handler) trên bộ nghe sự kiện sẽ được gọi để xử lý
  17. Xử lý sự kiện #17
  18. WindowListener #18 public interface WindowListener{ public void windowClosing(WindowEvent evt); public void windowOpened(WindowEvent evt); public void windowClosed(WindowEvent evt); public void windowActivated(WindowEvent evt); public void windowDeactivated(WindowEvent evt); public void windowIconified(WindowEvent evt); public void windowDeiconified(WindowEvent evt); }
  19. MouseListener #19 public interface MouseListener { public void mousePressed(MouseEvent evt); public void mouseReleased(MouseEvent evt); public void mouseClicked(MouseEvent evt); public void mouseEntered(MouseEvent evt); public void mouseExited(MouseEvent evt); }
  20. KeyListener #20 public interface KeyListener { public void keyPressed(KeyEvent evt); public void keyReleased(KeyEvent evt); public void keyTyped(MouseEvent evt); }
  21. Xử lý sự kiện #21 • Phương thức xử lý sự kiện public void actionPerformed(Lớp sự kiện) { } • Xác định nguồn phát sinh sự kiện Kiểu component tên đối tượng.getSource()
  22. java.awt.Frame #22 • Frame được dùng để xây dựng các ứng dụng GUI chạy độc lập • Frame là một cửa sổ có thanh tiêu đề và các đường biên. Bố cục mặc định của Frame là BorderLayout
  23. java.awt.Frame #23 • Frame kế thừa từ Window, nó có thể nghe các sự kiện xảy ra trên cửa sổ khi cài đặt giao tiếp WindowListener • Các ứng dụng độc lập thường tạo ra cửa sổ kế thừa từ lớp Frame
  24. import java.awt.Frame; import java.awt.event.WindowEvent; java.awt.event.WindowListener; import#24 public class ViDuVeFrame extends Frame implements WindowListener{ public ViDuVeFrame(){ super("Vi du ve Frame"); this.setSize(300, 200); this.addWindowListener(this); } @Override public void windowClosing(WindowEvent e) { System.exit(0); } public static void main(String []args) { ViDuVeFrame vd = new ViDuVeFrame(); vd.setVisible(true); } }
  25. java.awt.Panel #25 • Được dùng để tạo ra các giao diện theo ý muốn (nhóm các component lại với nhau) • Một giao diện có thể có nhiều panel sắp xếp theo một layout nhất định, mỗi panel lại có các component sắp xếp theo một layout riêng • Panel có bố cục mặc định là FlowLayout
  26. java.awt.Panel #26 Panel(BorderLayout) TextField Button 12 Button Panel(GridLayout) Frame(BorderLayout)
  27. Ví dụ Panel #27 import java.awt.*; public class ViDuPanel extends Frame { Panel myPanel; public ViDuPanel(){ super("Vi du Frame co chua Panel"); this.setSize(300, 200); myPanel=new Panel(); this.add(myPanel); } public static void main(String []args){ ViDuPanel vd = new ViDuPanel(); vd.setVisible(true); } }
  28. java.awt.Dialog #28 • Là một cửa sổ, thường dùng để nhập hoặc hiển thị thông tin với người dung, bố cục mặc định là BorderLayout • Hai loại hộp thoại • Modal: Phải đóng hộp thoại trước khi chuyển sang cửa sổ khác • Modaless: Có thể giữ nguyên hộp thoại và chuyển sang cửa sổ khác
  29. Java.awt.Dialog #29 import java.awt.*; public class ViDuDialog extends Frame { public ViDuDialog(){ super("Vi du Frame co chua Dialog"); this.setSize(300, 200); Dialog dialog = new Dialog(this, "Vi du Dialog“ , false); dialog.setSize(200, 100); dialog.setVisible(true); } public static void main(String []args){ ViDuDialog vd= new ViDuDialog(); vd.setVisible(true); } }
  30. Thêm đối tượng component #30 1. Khai báo đối tượng component cần thêm 2. Khởi tạo đối tượng với các phương thức khởi tạo phù hợp 3. Xác định container chứa component này 4. Sử dụng phương thức add (aComponent) để thêm component vào container
  31. java.awt.Label #31 • Label dùng để trình bày một chuỗi văn bản ra màn hình • Một số phương thức của Label: • public Label(); // tạo nhãn • public Label(String s); // tạo nhãn với nội dung s • public Label(String s, int align); // tạo và canh lề • void setText(String s); // đặt nội dung nhãn • void setAlignment(int align); // canh lề nhãn •
  32. Ví dụ Label #32 import java.awt.Frame; import java.awt.Label; public class ViDuLabel { public static void main(String []args) { Frame myFrame = new Frame("Frame co chua Label"); myFrame.setSize(300, 200); Label myLabel = new Label(); myLabel.setText(“Day la Label"); myLabel.setAlignment(Label.CENTER); myFrame.add(myLabel); myFrame.setVisible(true); } }
  33. java.awt.Button #33 • Một số phương thức của Button • Button(); // tạo nút nhấn • Button(String s); // tạo nút nhấn có tên s • void setLabel(String s); // đổi tên nút • String getLabel(); // lấy tên nút nhấn • Để lắng nghe sự kiện nhấn nút ta cần cài đặt giao tiếp ActionListener
  34. Ví dụ Button #34 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ViDuButton extends Frame implements ActionListener { Button myButton; public ViDuButton() { super("Frame co chua Button"); this.setSize(300, 200); myButton = new Button("Button"); myButton.setSize(50, 10); this.add(myButton); this.setVisible(true); myButton.addActionListener(this); }
  35. Ví dụ Button #35 public void actionPerformed(ActionEvent ae) { if (ae.getSource() == myButton) { //Định nghĩa xử cho sự kiện nhấn nút } } public static void main(String[] args) { ViDuButton vd = new ViDuButton(); vd.setVisible(true); } }
  36. java.awt.Text Field #36 • Text Field (ô văn bản) cho phép nhận dữ liệu từ bàn phím trên một dòng • Một số phương thức – TextField( ); // khởi tạo – void setEditable(boolean b); // đặt/tắt chế độ nhập – void setEchoChar(char c); // đặt kí tự hiển thị • Đối tượng nghe cần cài đặt 2 giao tiếp – ActionListener – TextListener • Cài đặt phương thức textValueChanged();
  37. Ví dụ Text Field import#37 java.awt.Frame; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.TextEvent; import java.awt.event.TextListener; public class ViDuTextField extends Frame implements ActionListener, TextListener { TextField myTextField; public ViDuTextField(){ super("Frame co Text Field"); this.setSize(300, 200); myTextField = new TextField(30); this.add(myTextField); myTextField.addTextListener(this); myTextField.addActionListener(this); }
  38. Ví dụ Text Field #38 public static void main(String []args) { ViDuTextField vd = new ViDuTextField(); vd.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { //Định nghĩa xử lý cho sự kiện } @Override public void textValueChanged(TextEvent e) { //Định nghĩa xử lý cho sự kiện } }
  39. java.awt.Choice #39 • Choice cung cấp khả năng lựa chọn một trong số các mục trong danh sách sổ xuống • Một số phương thức • Choice(); // khởi tạo • void addItem(String s); // thêm item là s • String getItem(int index);// lấy item có chỉ số index • String getSeclectedItem(); // trả về item được chọn • int getSelectedIndex(); // trả về index của item được chọn • Lớp nghe cài đặt giao tiếp ItemListener • Cài đặt phương thức itemStateChanged( )
  40. Ví dụ Choice #40 import java.awt.Choice; import java.awt.Frame; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; public class ViDuChoice extends Frame implements ItemListener { Choice myChoice; public ViDuChoice() { super("Frame co lua chon"); this.setSize(300, 200); myChoice = new Choice(); myChoice.addItem("Item1"); myChoice.addItem("Item2"); myChoice.addItem("Item3"); myChoice.addItemListener(this); this.add(myChoice); }
  41. Ví dụ Choice #41 public static void main(String[] args) { ViDuChoice vd = new ViDuChoice(); vd.setVisible(true); } @Override public void itemStateChanged(ItemEvent e) { //Xử lý sự kiện chọn item } }
  42. java.awt.Checkbox #42 • Checkbox cung cấp các hộp tuỳ chọn cho người dùng đánh dấu • Một số phương thức • Checkbox( ); // khởi tạo • void setLabel(Strings); // đặt nhãn mới • booleangetState(); // lấy trạng thái hiện tại • Lớp nghe cài đặt giao tiếp ItemListener • Cài đặt phương thức itemStateChanged( )
  43. Ví dụ Checkbox #43 import java.awt.Checkbox; import java.awt.Frame; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; public class ViDuCheckBox extends Frame implements ItemListener{ Checkbox myCheckbox; public ViDuCheckBox(){ super("Frame co Checkbox"); this.setSize(300, 200); myCheckbox = new Checkbox("Danh dau chon"); myCheckbox.addItemListener(this); this.add(myCheckbox); }
  44. Ví dụ Checkbox #44 public static void main(String []args) { ViDuCheckBox vd = new ViDuCheckBox(); vd.setVisible(true); } @Override public void itemStateChanged(ItemEvent e) { //Định nghĩa xử lý sự kiện chọn } }
  45. Radio Button #45 • Các Checkbox có thể được đặt trong một CheckboxGroup để tạo ra các Radio Button • Chỉ cho phép chọn 1 tuỳ chọn trong nhóm
  46. import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; #46 public class ViDuRadioButton extends Frame implements ItemListener { CheckboxGroup myGroup; Checkbox myRadio1; Checkbox myRadio2; public ViDuRadioButton() { super("Frame co Radio button"); this.setSize(300, 200); this.myGroup = new CheckboxGroup(); this.myRadio1 = new Checkbox("Nam",myGroup, true); this.myRadio2 = new Checkbox("Nu",myGroup, false); this.add(myRadio1); this.add(myRadio2); myRadio1.addItemListener(this); myRadio2.addItemListener(this); this.setLayout(new GridLayout(1, 2)); }
  47. #47 public static void main(String[] args) { ViDuRadioButton vd = new ViDuRadioButton(); vd.setVisible(true); } @Override public void itemStateChanged(ItemEvent e) { //Định nghĩa xử lý thay đổi lựa chọn } }
  48. java.awt.List #48 • List cho phép người dùng chọn một hay nhiều item từ một danh sách các item • Một số phương thức – List(); // khởi tạo – List(int items, boolean ms); // cấu tử mở rộng – String getSeclectedItem(); // lấy lại thành phần được chọn • Lớp nghe cài đặt giao tiếp ItemListener và/hoặc ActionListener
  49. Ví dụ List import java.awt.*; import#49 java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; public class ViDuList extends Frame implements ItemListener, ActionListener { List myList; public ViDuList(){ super("Frame co chua list"); this.setSize(300, 200); myList = new List(3); myList.add("List 1"); myList.add("List 2"); myList.add("List 3"); this.add(myList); myList.addItemListener(this); myList.addActionListener(this); }
  50. Ví dụ List #50 @Override public void actionPerformed(ActionEvent e) { // Xử lý sự kiện } @Override public void itemStateChanged(ItemEvent e) { // Xử lý sự kiện } public static void main(String []args){ ViDuList vd=new ViDuList(); vd.setVisible(true); } }
  51. Trình bày component (Layout) #51 • Flow Layout • Border Layout • Grid Layout • Gridbag Layout • Null Layout
  52. FlowLayout #52 • Các component được sắp xếp theo thứ tự từ trái sang phải và từ trên xuống dưới • Các component có kích thước tuỳ chỉnh • Nếu chiều rộng của Container không đủ chỗ cho các component thì tự động tạo ra một dòng mới • Thường được dùng để sắp xếp các button trong 1 Panel • Có thể điều chỉnh khoảng cách giữa các component
  53. Ví dụ #53
  54. import java.awt.*; public class ViDuFlowLayout extends Frame { Button[] myButton; #54 public ViDuFlowLayout() { super("Vi du FlowLayout"); this.setSize(300, 200); this.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 10));//Canh giữa, cách ngang 20, dọc 10 myButton = new Button[10]; for (int i = 0; i < 10; i++) { myButton[i] = new Button("Button " + (i + 1)); this.add(myButton[i]); } } public static void main(String[] args) { ViDuFlowLayout vd = new ViDuFlowLayout(); vd.setVisible(true); } }
  55. BorderLayout #55 • Chia làm 4 vùng: NORTH, SOUTH, WEST, EAST và CENTER • Cho phép sắp xếp và thay đổi kích thước của những component chứa trong nó sao cho vừa với 5 vùng tương ứng • Không cần phải gắn component vào cho tất cả các vùng
  56. BorderLayout #56 • Các component ở vùng NORTH và SOUTH có chiều cao tùy ý nhưng có chiều rộng đúng bằng chiều rộng vùng chứa • Các component ở vùng EAST và WEST có chiều rộng tùy ý nhưng có chiều cao đúng bằng chiều cao vùng chứa. • Các component ở vùng CENTER có chiều cao và chiều rộng phụ thuộc vào các vùng xung quanh
  57. Ví dụ BorderLayout #57
  58. public class ViDuBorderLayout extends Frame { Button leftButton, rightButton, topButton, bottomButton, centerButton; public ViDuBorderLayout() { #58 super("Vi du Border Layout"); this.setSize(500, 300); this.setLayout(new BorderLayout(20, 10)); topButton = new Button("Top"); bottomButton = new Button("Bottom"); leftButton = new Button("Left"); rightButton = new Button("Right"); centerButton = new Button("Center"); this.add("North", topButton); this.add("South", bottomButton); this.add("West", leftButton); this.add("East", rightButton); this.add("Center", centerButton); } public static void main(String[] args) { ViDuBorderLayout vd = new ViDuBorderLayout(); vd.setVisible(true); } }
  59. GridLayout #59 • Bộ trình bày tạo một khung lưới vô hình với các ô bằng nhau • Các đối tượng sẽ đặt vừa kích thước với từng ô • Thứ tự sắp xếp từ trái qua phải và từ trên xuống dưới
  60. Ví dụ GridLayout #60
  61. import java.awt.*; #public61 class ViDuGridLayout extends Frame { Button myButton[]; Checkbox myCheckbox; TextField myText; List myList; public ViDuGridLayout() { super("Vi du Grid Layout"); this.setSize(600, 300); this.setLayout(new GridLayout(4, 2, 20, 10)); myButton = new Button[5]; for(int i=0; i<5; i++){ myButton[i]=new Button("Button " + (i+1)); this.add(myButton[i]); }
  62. myCheckbox = new Checkbox("Checkbox", true); #62 myText =new TextField("Enter text here"); myList = new List(3); myList.add("List 1"); myList.add("List 2"); myList.add("List 3"); this.add(myCheckbox); this.add(myText); this.add(myList); } public static void main(String[] args) { ViDuGridLayout vd = new ViDuGridLayout(); vd.setVisible(true); } }
  63. GridBagLayout #63 • Các componet sẽ được trình bày trên 1 khung lưới vô hình • Các đối tượng có thể là 2, 3, ô hay nhiều hơn tùy theo các ràng buộc được chỉ định thông qua đối tượng GridBagConstraints • gridx, gridy: vị trí ô sẽ đưa đối tượng con vào • gridwidth, gridheight: xác định số ô cho đối tượng • Insets: khoảng cách biên phân cách theo 4 chiều (trên, dưới, trái, phải) • weightx, weighty: kích thước của đối tượng
  64. Ví dụ GridBagLayout #64
  65. public class ViDuGridBagLayout extends Frame { Button myButton[]; public ViDuGridBagLayout() { #65 super("Vi du GridBag Layout"); this.setSize(400, 300); GridBagLayout layout = new GridBagLayout(); this.setLayout(layout); GridBagConstraints cst = new GridBagConstraints(); cst.insets = new Insets(5, 5, 5, 5); myButton = new Button[6]; for(int i=0; i<6; i++){ myButton[i]=new Button("Button " + (i+1)); } cst.fill = GridBagConstraints.BOTH; cst.gridx =0; cst.gridy=0; cst.weightx = 0.5; cst.weighty = 0.0; cst.gridwidth = 2; cst.gridheight = 1; layout.setConstraints(myButton[0], cst);
  66. #66 cst.gridx = 2; cst.gridy= 0; cst.weightx = 0.0; cst.weighty = 0.0; cst.gridwidth = 1; cst.gridheight = 1; layout.setConstraints(myButton[1], cst); cst.gridx =3; cst.gridy=0; cst.weightx = 0.0; cst.weighty = 0.5; cst.gridwidth = 1; cst.gridheight = 3; layout.setConstraints(myButton[2], cst);
  67. #67 cst.gridx =0; cst.gridy=1; cst.weightx = 0.0; cst.weighty = 0.0; cst.gridwidth = 1; cst.gridheight = 1; layout.setConstraints(myButton[3], cst); cst.gridx = 1; cst.gridy= 1; cst.weightx = 0.5; cst.weighty = 0.0; cst.gridwidth = 2; cst.gridheight = 1; layout.setConstraints(myButton[4], cst);
  68. cst.gridx = 0; #68 cst.gridy= 2; cst.weightx = 0.5; cst.weighty = 0.0; cst.gridwidth = 3; cst.gridheight = 1; layout.setConstraints(myButton[5], cst); for(int i=0; i<6; i++){ this.add(myButton[i]); } } public static void main(String[] args) { ViDuGridBagLayout vd = new ViDuGridBagLayout(); vd.setVisible(true); } }
  69. NullLayout #69 • Phải qui định kích thước của khung chứa và kích thước, vị trí của từng đối tượng component trong khung chứa • Phương thức setLayout(null) • Định vị và kích thước cho component • public void setLocation(Point p) • public void setSize(Dimension p) • public void setBounds(Rectangle r)
  70. Ví dụ NullLayout #70
  71. public class ViDuNullLayout extends Frame { Button myButton1, myButton2; public ViDuNullLayout() { #71 super("Vi du Null Layout"); this.setBounds(5, 5, 490, 290); this.setLayout(null); myButton1 = new Button("Button 1"); myButton1.setSize(100, 50); myButton1.setBounds(50, 50, 100, 50); myButton2 = new Button("Button 2"); myButton2.setSize(new Dimension(200, 30)); myButton2.setBounds(50, 200, 200, 30); this.add(myButton1); this.add(myButton2); } public static void main(String[] args) { ViDuNullLayout vd = new ViDuNullLayout(); vd.setVisible(true); } }
  72. Bài tập #72 Thiết kế giao diện và xử lý cho bài toán cộng, trừ, nhân và chia 2 số được nhập từ 2 TextField, gồm các thành phần: • 2 ô nhập liệu • 1 ô xuất kết quả (không cho phép nhập) • Các nút nhấn: cộng, trừ, nhân, chia và thoát chương trình !!!Đối với phép chia: nếu số chia = 0 thì hiển thị hộp thoại thông báo lỗi
  73. Bài tập về nhà #73 Thiết kế giao diện và viết chương trình giả lập phần mềm calculator
  74. Menu #74 Bao gồm các loại • Menubar • Menu • PopupMenu • MenuItem
  75. Menubar #75 Dùng để chứa menu, các phương thức • Menubar(): khởi tạo • Add(Menu): thêm menu vào menubar Gắn menu vào frame • Đối tượng frame.setMenuBar(đối tượng menu);
  76. Menu và PopupMenu #76 Các phương thức: • Menu(String): khởi tạo menu • add(MenuItem): thêm một item vào menu • add(Menu): thêm một menu con vào menu đã có • addSeparator(): thêm đường ngăn cách menu Xử lý sự kiện: ActionEvent, ActionListioner
  77. MenuItem #77 Các phương thức: • MenuItem(String): khởi tạo • CheckboxMenuItem(String): khởi tạo menu dạng checkbox • getState(): trạng thái checkbox menu • enable() • disable(): làm mờ Xử lý sự kiện: ActionEvent, ActionListener
  78. Ví dụ MenuBar #78
  79. public class ViDuMenuBar extends Frame implements ActionListener#79 { MenuBar myMenuBar; Menu myMenu; public ViDuMenuBar(){ super("Vi du menubar"); this.setSize(500, 300); myMenuBar = new MenuBar(); myMenu = new Menu("File"); this.setMenuBar(myMenuBar); myMenuBar.add(myMenu); myMenu.add(new MenuItem("Open ")); myMenu.add(new MenuItem("Save ")); myMenu.addSeparator(); myMenu.add(new MenuItem(("Exit"))); myMenu.addActionListener(this);
  80. this.addWindowListener(new WindowAdapter() { @Override #80 public void windowClosing(WindowEvent e) { System.exit(0); } }); } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("Exit")) System.exit(0); } public static void main(String []args){ ViDuMenuBar vd = new ViDuMenuBar(); vd.setVisible(true); } }
  81. Ví dụ PopupMenu #81
  82. public class ViDuPopupMenu extends Frame implements MouseListener{ PopupMenu myMenu; #82 public ViDuPopupMenu(){ super("Vi du PopupMenu"); this.setSize(500, 300); myMenu = new PopupMenu("Popup menu"); myMenu.add(new MenuItem("Copy ")); myMenu.add(new MenuItem("Cut ")); myMenu.addSeparator(); myMenu.add(new MenuItem(("Paste"))); this.add(myMenu); this.addMouseListener(this); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); }
  83. @Override public void mouseClicked(MouseEvent e) { #83 if(e.getButton()==MouseEvent.BUTTON3) myMenu.show(e.getComponent(), e.getX(), e.getY()); } @Override public void mousePressed(MouseEvent e) {} @Override public void mouseReleased(MouseEvent e) {} @Override public void mouseEntered(MouseEvent e) {} @Override public void mouseExited(MouseEvent e) {} public static void main(String []args){ ViDuPopupMenu vd = new ViDuPopupMenu(); vd.setVisible(true); } }
  84. Applet #84 • Là một chương trình Java được gọi trong ứng dụng khác • Thường là trình duyệt Web có hỗ trợ Java • Applet có thể thể hiện multimedia, tạo được sự tương tác với user
  85. Cấu trúc tổng quát của Applet import java.applet.Applet; #85 import java.awt.*; public class ViDuApplet extends Applet { // Khai báo thuộc tính public void init() { // Khởi tạo thuộc tính, load hình ảnh } public void start() { // Kích hoạt } public void stop() { // Dừng } public void destroy() { // Dọn dẹp trước khi thoát applet }
  86. Cấu trúc tổng quát của Applet #86 public void paint(Graphics g) { // Các thao tác vẽ } public void repaint(Graphics g) { // Tự động gọi update() } public void update(Graphics g) { // Tự động gọi paint() } //Các phương thức khác }
  87. Vòng đời của Applet #87
  88. Vòng đời của Applet #88 • init(): Chỉ được gọi khi applet bắt đầu thực thi • start(): Được gọi sau init() hoặc khi applet được trở lại • paint(): Được gọi sau khi trình duyệt init và start, và được gọi lại khi trình duyệt được vẽ lại • stop(): Được gọi khi applet được thu nhỏ • destroy(): Được gọi khi applet kết thúc (tắt trình duyệt)
  89. Sử dụng Applet #89 • Để thực thi một applet, tạo một tập tin HTML có sử dụng thẻ applet hoặc thẻ object • Thẻ applet/object có hai thuộc tính: Width, Height
  90. Ví dụ #90
  91. import java.applet.Applet; import java.awt.*; #91 public class MyFirstApplet extends Applet{ public void paint(Graphics g){ g.drawString("Hello, this is my first Java Applet", 25, 50); MyFirstApplet.java } } Ví dụ về Java Applet MyFirstApplet.html
  92. Các phương thức của Graphics #92 • drawString(string, left, bottom): Vẽ một xâu với font chữ và màu hiện tại với góc trái (left) và đáy (bottom) của xâu • drawRect(left, top, width, height): Vẽ đường viền hình chữ nhật (1-pixel border) với màu hiện tại • fillRect(left, top, width, height): Vẽ hình chữ nhật đặc với màu hiện tại • drawLine(x1, y1, x2, y2): Vẽ một đường với độ dày 1 pixel từ tọa độ (x1, y1) đến tọa độ (x2, y2)
  93. Các phương thức của Graphics (tt) #93 • drawOval, fillOval: Vẽ hình oval (viền/đặc) với các tham số chỉ ra là hình chữ nhật bao quanh • drawPolygon, fillPolygon: Vẽ hình đa giác (viền/đặc) với các điểm được xác định bởi các mảng hoặc một đối tượng Polygon • drawPolyline: Vẽ đường gấp khúc • drawImage: Vẽ hình ảnh (JPEG hoặc GIF)
  94. Các phương thức của Graphics (tt) #94 • drawArc: Vẽ đường viền hình cung • fillArc: Vẽ hình cung đặc • Color getColor(): Lấy màu hiện tại • setColor(Color): Đặt màu • Font getFont(): Lấy thông tin font • setFont(Font f): Gán thông tin mới cho font
  95. import java.applet.Applet; import java.awt.*; #95 public class ViDuGraphics extends Applet { public void paint(Graphics g){ g.setFont(new Font("Tahoma“ , Font.BOLD, 20)); g.setColor(Color.BLUE); g.drawString("Ví dụ đối tượng Graphics", 15, 20); g.setColor(Color.RED); g.drawLine(15, 30, 215, 30); g.drawRect(15, 40, 200, 50); g.fillOval(15, 40, 200, 50); int x[]={15, 40, 100, 170}; int y[]={100, 140, 150, 250}; g.drawPolygon(x, y, 4); } }
  96. Java Swing #96
  97. Q&A #97