Lập Trình Giao Diện GUI’s • Gói AWT được sử dụng trong các phiên bản trước jdk1.2 (java2) • Swing được đưa vào trong phiên bản jdk1.2 và có nhiều chức năng hơn AWT • Swing Components thường có tên bắt đầu với 'J' – AWT có lớp Panel – Swing có lớp tương ứng là JPanel Graphical User Interface (GUI) AWT (Abstract Windows Toolkits) import java.*; Swing (Java Foundation Classes Package) import javax.*; Tất cả Swing component có tên bắt đầu với J… The Swing API • Gói Swing là 1 thành phần của Java Foundation Classes (JFC) • JFC cung cấp một tập các chức năng giúp xây dựng các ứng dụng GUI. 5 GUI • Java GUI hierarchy AWT LayoutManager FontMetrics Panel Applet JApplet Graphics Object Component Container Window Frame JFrame Font Color Dialog JDialog Dimension JComponent Swing lightweight heavyweight 6 GUI • Java GUI hierarchy JMenuBar JMenuItem AbstractButton JButton JComboBox JScrollPane … JComponent JLabel JTextArea JTextComponent JTextField JPasswordField JPanel … etc. Swing lightweight heavyweight Swing Components • Swing Components có nhiều mức khác nhau • Các mức này qui định các Component trong 1 ứng dụng GUI kết hợp với nhau. • Cách kết hợp này gọi là Swing Containment Hierarchy Khái niệm container Là thành phần mà có thể chứa các thành phần khác,có thể vẽ và tô màu.
Frame/JFrame, Panel/JPanel, Dialog/JDialog, ScrollPane/JScrollPane, … Gắn component vào khung chứa containerObj.add(compObj); Lấy thông tin của component objectName.get…( ); Gán thông tin cho component objectName.set…( ); Nguyên tắc xây dựng GUI trong java Lựa chọn 1 container: Frame/JFrame, Window/JWindow, Dialog/JDialog, … Tạo các điều khiển: (buttons, text areas.) Đưa các điều khiển vào vùng chứa Sắp xếp các điều khiển(layout) Thêm các xử lý sự kiện (Listeners) Containment Hierarchy Top-level container: JFrame, JDialog, JApplet Ví Dụ JFrame import javax.*; class Frame1 extends JFrame { /* Construction of the frame */ AppFrame1.java public Frame1() { closing window this.setVisible(true); 350 } } Containment Hierarchy Top Level Container Intermediate Container Atomic Atomic Atomic Component N Component N Component N Containment Hierarchy Top Level (JFrame) Atomic (JButton) Intermediate (JPanel) Atomic (JLabel) Containment Hierarchy • Top Level Containers – Là nơi để hiển thị các Component khác – Ví dụ: • JFrame • JDialog • JApplet Containment Hierarchy • Intermediate Containers – Dùng để xác định vị trí của các Atomic Components – Hoặc cung cấp cơ chế để tương tác với khung chứa. – Ví dụ: • JPanel • JScrollPane • JTabbedPane Containment Hierarchy • Atomic Components – Không chứa các Components khác – Dùng để cung cấp thông tin đến người sử dụng – Hoặc lấy thông tin từ người sử dụng – Ví dụ: • JButton • JLabel • JComboBox • JTextField • JTable Containment Hierarchy • Mọi Top Level Container có 1 intermediate Container gọi là Content Pane • Các atomic component phải gắn vào content pane – Ví dụ – JFrame frame = new JFrame(.); JPanel pane = new JPanel(); frame.add(pane); Khái niệm Layout Manager Các loại layout khác nhau: Flow Layout Border Layout Grid Layout GridBag Layout Null Layout … Trình quản lý layout được thiết lập bằng cách gọi phương thức ‘setLayout( )’ FlowLayout Là trình quản lý layout mặc định cho các applet và các panel Với FlowLayout các thành phần sẽ được xắp xếp từ góc trái trên đến góc phải dưới của màn hình Các constructor: FlowLayout layout = new FlowLayout(); FlowLayout layout = new FlowLayout(FlowLayout.RIGHT); // Canh lề bên phải FlowLayout Flow Layout – Left and Right Aligned BorderLayout Là trình quản lý layout mặc định cho Window, Frame và Dialog Trình quản lý này có thể xắp xếp đến 5 thành phần trong container Các thành phần có thể được đặt vào 5 hướng NORTH, EAST, SOUTH, WEST và CENTER của container Ví dụ: Để thêm một thành phần vào vùng North của container Button b1= new Button(“North Button”); setLayout(new BorderLayout( )); add(b1, BorderLayout.NORTH); BorderLayout GridLayout Hỗ trợ việc chia container thành một lưới Các thành phần được bố trí trong các dòng và cột Một ô lưới nên chứa ít nhất một thành phần Kiểu layout này được sử dụng khi tất cả các thành phần có cùng kích thước GridLayout layout = new GridLayout(no. of rows, no. of columns); containerObj.setLayout(null); Swing Components Sử Dụng Swing Component 2.
Using Swing Components add, set, get method Phương thức dùng để gắn components: objectName.add(… ); Phương thức dùng để lấy thuộc tính: objectName.getxxx( ); Phương thức dùng để gán thuộc tính: objectName.setxxx( ); Mô hình xử lý sự kiện Có 3 yếu tố quan trọng trong mô hình xử lý sự kiện: Nguồn phát sinh sự kiện (event source) Sự kiện (event object) Bộ lắng nghe sự kiện (event listener) EventObject User action Generate Notify listener an event Trigger an event Source Object Listener Object Register a listener object Event Handler Xử Lý Sự Kiện Khai báo lớp xử lý sự kiện • public class MyClass implements <Event>Listener Cài đặt các phương thức trong listener interface. • Ví dụ: ActionListener • public void actionPerformed(ActionEvent e) { .//code that reacts to the action. } Gắn bộ xử lý vào component • someComponent.add<Event>Listener( instanceOfMyClass); Hành động, sự kiện, lắng nghe Đối tượng Sự kiện Bộ lắng nghe Window, Frame, … WindowEvent WindowListener Button, MenuItem, … ActionEvent ActionListener TextComponent, … TextEvent TextListener List, … ActionEvent ActionListener … ItemEvent ItemListener ComponentEvent ComponentListener MouseEvent MouseListener MouseMotionListener KeyEvent KeyListener JLabel Label dùng để hiển thị một chuỗi văn bản thông thường nhằm mô tả thêm thông tin cho các đối tượng khác. Các constructor của JLabel: JLabel() JLabel(String text) JLabel(String text,int hAlignment) JLabel(Icon icon) JLabel(Icon icon, int hAlignment) JLabel(String text,Icon icon,int hAlignment) Các thuộc tính JLabel • text • icon • horizontalAlignment • verticalAlignment Using Labels Ví Dụ JButton Button là một thành phần gây ra một sự kiện hành động khi được kích chuột.
Các constructor của JButton: JButton() JButton(String text) JButton(String text, Icon icon) JButton(Icon icon) Các thuộc tính JButton • text • icon • mnemonic • horizontalAlignment • verticalAlignment • horizontalTextPosition • verticalTextPosition Using Buttons Đáp ứng các sự kiện JButton • public void actionPerformed(ActionEvent e) • { • // Get the button label • String actionCommand = e.getActionCommand(); • // Make sure the event source is Left button • if (e.getSource() instanceof JButton) • // Make sure it is the right button • if ("Left".println ("Button pressed!"); • } Menus • Java cung cấp một số lớp - JMenuBar, JMenu, JMenuItem, JCheckBoxMenuItem, và JRadioButtonMenuItem - để thực thi menu trong một frame. • Một JFrame hoặc JApplet có thể chứa một menu bar trên đó có gắn các pull-down menu. Các menu chứa các menu item để người dùng lựa chọn (hoặc bật/tắt). Menu bar có thể được xem như một cấu trúc để hỗ trợ các menu.
Menu Demo Lớp JMenuBar Menu bar chứa các menu; menu bar chỉ có thể được thêm vào 1 frame. Đoạn code sau tạo và thêm một JMenuBar vào 1 frame: JFrame f = new JFrame(); f.setJMenuBar(mb); Lớp Menu Bạn gắn các menu vào một JMenuBar. Đoạn code sau tạo 2 menu File và Help, và thêm chúng vào JMenuBar mb: JMenu fileMenu = new JMenu("File", false); JMenu helpMenu = new JMenu("Help", true); mb.add(helpMenu); Lớp JMenuItem Đoạn code sau thêm các mục chọn (menu item) và các separator trong menu fileMenu: fileMenu.add(new JMenuItem("Exit")); Submenus Bạn có thể thêm các submenus vào các menu item. Đoạn code sau thêm các submenu “Unix”, “NT”, và “Win95” vào trong mục chọn “Software”.
JMenu softwareHelpSubMenu = new JMenu("Software"); JMenu hardwareHelpSubMenu = new JMenu("Hardware"); helpMenu.add(new JMenuItem("Win95")); Submenu Demo SWING Dialog Boxes • Nhận thông tin từ người sử dụng • số liệu,… • danh mục tập tin,… • Hiển thị kết quả • hiển thị thông tin cảnh báo • in kết quả lên màn hình,… JOptionPane JOptionPane.showInputDialog(“Enter your home directory”); JOptionPane Static method call JOptionPane.