Bài giảng Lập trình Java - Bài 8: Giới thiệu về Swing
Java Foundation Classes (JFC)
FC (Foundation Classes) là một nhóm các thư viện
được thiết kế để hỗ trợ lập trình viên tạo ra các
ứng dụng GUI trên Java.
FC đơn giản hóa quá trình thiết kế và làm giảm
thời gian thực hiện viết mã.
Swing chỉ là một trong năm thư viện tạo nên JFC.
JFC cũng chứa Abstract Window Toolkit
(AWT),Accessibility API, 2D API và tăng cường hỗ
trợ khả năng kéo thả (Drag and Drog).
Swing
Swing giải quyết các hạn chế liên quan đến các thành phần
của AWT thông qua việc sử dụng 2 tính năng: các thành phần
lightweight và pluggable look and feel.
Các thành phần trong swing là lightweight: Các thành phần
này được viết hoàn toàn bằng Java, do đó nó không phụ
thuộc vào một hệ điều hành cụ thể nào và nó cũng rất hiệu
quả và linh hoạt.
Các class Swing có khả năng viết những cảm quan
(Look&Feels) cho mỗi thành phần, và có thể thay đổi cảm
quan vào thời điểm chạy.
Swing có rất nhiều những thành phần mới như table, tree,
slider, spinner, progress bar, internal frame và text.
Tóm tắt nội dung tài liệu: Bài giảng Lập trình Java - Bài 8: Giới thiệu về Swing
LẬP TRÌNH JAVA Bài 8: Giới thiệu về Swing Điểm danh Khái niệm Applets Sự khác nhau giữa Applets và Applications Vòng đời của applet Một số phương thức của class Graphics Tạo một applet Sử dụng tham số trong Applets Xử lý sự kiện Một số interface và class xử lý sự kiện Một số ví dụ Nhắc lại bài trước Java Foundation Classes (AFC) Abstract Windowing Toolkit (AWT) Swing Các thùng chứa -Containers Các hộp thoại - Dialogs Quản lý Layout Các thành phần GUI – Components Xử lý sự kiện Nội dung bài học Java Foundation Classes (JFC) FC (Foundation Classes) là một nhóm các thư viện được thiết kế để hỗ trợ lập trình viên tạo ra các ứng dụng GUI trên Java. FC đơn giản hóa quá trình thiết kế và làm giảm thời gian thực hiện viết mã. Swing chỉ là một trong năm thư viện tạo nên JFC. JFC cũng chứa Abstract Window Toolkit (AWT),Accessibility API, 2D API và tăng cường hỗ trợ khả năng kéo thả (Drag and Drog). Java Foundation Classes JFC AWT Java 2D Accessibility Swing Drag & Drop Abstract Windowing Toolkit (AWT) Tuy nhiên AWT có hạn chế: • Các thành phần GUI có thể có hình dạng/hành động khác nhau trên các hệ điều hành khác nhau (heavyweight) • Look and Feel của mỗi thành phần không thể (dễ dàng) thay đổi. AWT chứa nhiều class và method cho phép thiết kế, quản lý cửa sổ và font chữ trên giao diện đồ họa. Mục đích chính của awt là hỗ trợ cho các ứng dụng applet nhưng cũng được dùng để thiết kế các chương trình có giao diện đồ họa độc lập. Swing Swing giải quyết các hạn chế liên quan đến các thành phần của AWT thông qua việc sử dụng 2 tính năng: các thành phần lightweight và pluggable look and feel. Các thành phần trong swing là lightweight: Các thành phần này được viết hoàn toàn bằng Java, do đó nó không phụ thuộc vào một hệ điều hành cụ thể nào và nó cũng rất hiệu quả và linh hoạt. Các class Swing có khả năng viết những cảm quan (Look&Feels) cho mỗi thành phần, và có thể thay đổi cảm quan vào thời điểm chạy. Swing có rất nhiều những thành phần mới như table, tree, slider, spinner, progress bar, internal frame và text. JSlider JList JCheckBox JToggleButton JButton AbstractButton JComboBox JLabel JScrollBar JTextComponent JTextField JTextArea JEditPane JRadioButton Object ButtonGroup Component ProgressMonitor InputStream Container JComponent FilterInputStream ProgressMonitorInputStream JPassword JMenuItem Các thành phần của Swing Containers • Top-level container là một container cấp cao nhất, ở trên cùng của một hệ thống phân cấp. • Swing cung cấp 4 container top-level container là: JFrame, JDialog, JWindow và JApplet. • Để hiển thị trên màn hình, mỗi một thành phần GUI phải là một phần của hệ thống phân cấp. Mỗi hệ thống phân cấp sẽ có một top-level là gốc. Trong đó JFrame hay được sử dụng nhất. Một container là một thành phần đặc biệt có thể chứa các thành phần khác. Top-Level Containers Menu Bar Các thành phần có thể nhìn thấy (Visible) Top-level container Content pane JFrame JFrame Là top-level container. JFrame được dùng để tạo ra 1 cửa sổ. JFrame() JFrame(String title) Các thành phần khác sẽ được add vào cửa sổ JFrame đó: frame.getContentPane().add(b); //cũ frame.add(b) //mới JFrame Các hằng số khi đóng 1 JFrame: DISPOSE_ON_CLOSE ( value =1) DO_NOTHING_ON_CLOSE (value = 2) EXIT_ON_CLOSE (value = 3) HIDE_ON_CLOSE (value = 4) // mặc định Đóng JFrame public int getDefaultCloseOperation() public void setDefaultCloseOperation(int operation) JFrame Khi thêm các thành phần vào JFrame thì: Các thành phần đó được add vào content pane của Frame. Content pane sử dụng BorderLayout làm mặc định. Sử dụng setSize() hoặc pack() để đặt kích thước cửa sổ. Sử dụng show() hoặc setVisible() để hiển thị Frame. JFrame JFrame frame = new JFrame(“My Frame”);//tiêu đề import javax.swing.*; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,200);// đặt kích thước cửa sổ frame.show();// hoặc setVisible(true) public static void main(String args[] { } class FrameTest { } JPanel là container được dùng để nhóm các thành phần với nhau. JPanel sử dụng FlowLayout là mặc định. JPanel có các constructor: JPanel() JPanel(LayoutManager mg) JPanel import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; public class Main { public static void main(String args []) { JFrame frame = new JFrame("JFrame is me"); JPanel jpan = new JPanel(); frame.add( jpan ); JButton btnHello = new JButton("Hello"); jpan.add(btnHello); frame.setSize(300,100); frame.setVisible(true); } } JPanel JApplet là một container. javax.swing.JApplet khác với java.applet.Applet. Khi thêm các thành phần vào JApplet bắt buộc phải thêm vào content pane của JApplet. Ví dụ: getContentPane().add(component); JApplet import java.awt.*; import javax.swing.*; public class JAppletExample extends JApplet { @Override public void init() { Container content = getContentPane(); content.setBackground(Color.white); content.setLayout(new FlowLayout()); content.add(new JButton("Button 1")); content.add(new JButton("Button 2")); content.add(new JButton("Button 3")); } } JApplet Dialog: JOptionPane JOptionPane cho phép bạn dễ dàng tạo ra các hộp thoại để nhập dữ liệu và hiển thị kết quả. Có rất nhiều lựa chọn khi sử dụng JOptionPane. Sau đây là cú pháp dạng đơn giản: Giá trị Phương thức userInput = JOptionPane.showInputDialog(component, text); JOptionPane.showMessageDialog(component, text); Trong đó: - component là cửa sổ mà hộp thoại này sẽ đặt lên trên, nếu không có thì đặt là null - text là xâu ký tự Dialog: JOptionPane import javax.swing.JOptionPane; public class JOptionPaneTest1 { public static void main(String[] args) { String ans; ans = JOptionPane.showInputDialog(null, "Tốc độ trên giờ?"); double mph = Double.parseDouble(ans); double kph = 1.621 * mph; JOptionPane.showMessageDialog(null, "KPH = " + kph); System.exit(0); } } Dialog: JFileChooser Sử dụngJFileChooser dùng để lựa chọn một tập tin hoặc thư mục trong ổ đĩa. JFileChooser fileChooser = new JFileChooser(); int retval = fc.showOpenDialog(null); if (retval == JFileChooser.APPROVE_OPTION) { File myFile = fc.getSelectedFile(); //Các thao tác xử lý file } Cho phép chọn file/thư mục hoặc cả hai: fc.setFileSelectionMode(JFileChooser.FILES_ONLY);//mặc định fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); Layout Object FlowLayout GridLayout BorderLayout GridBagLayout BoxLayout CardLayot Là Layout đơn giản và là mặc định cho Panel. Các thành phần được sắp xếp theo hàng. Hướng của layout: FlowLayout.LEFT FlowLayout.CENTER FlowLayout.RIGHT Khoảng cách giữa các thành phần: Có giá trị mặc định = 5 Có thể đặt lại qua phương thức setHgap và setVgap. FlowLayout GridLayout Là tập hợp các ô lưới có cùng kích thước Khoảng cách giữa các ô: Mặc định = 5 Có thể đặt lại qua phương thức setHgap và setVgap. Thay đổi kích thước của các ô: Các ô có thể có kích thước to hơn phụ thuộc vào kích thước của cửa sổ. BorderLayout Có 5 vùng: NORTH, SOUTH, EAST, WEST, CENTER Không phải tất cả 5 vùng đều được sử dụng Để đặt các thành phần vào một vị trí: Panel.setLayout(new BorderLayout()) Panel.add(new JButton(“Click here”), BorderLayout.NORTH) Đặt lại khoảng cách giữa các thành phần: Có thể đặt lại qua phương thức setHgap và setVgap. Sử dụng BorderLayout(int horGap, int verGap) Các thành phần được sắp xếp: X_AXIS: Theo chiều ngang từ trái qua phải Y_AXIS: Theo chiều dọc từ trên xuống dưới panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); BoxLayout Y Axis X Axis BoxLayout Components JApplet** JButton JCheckBox JColorChooser JComboBox JDialog** JFileChooser JFormattedTextField JFrame** JLabel JMenu JList JMenuBar JMenuItem JPopupMenu JPanel JProgressBar PasswordField JRadioButton ScrollBar JSlider JSpinner JTable JTextArea JTextField JToggleButton JToolBa JTree JWindow ** Một số component thường dùng: **: Là top-level containers. Component: JLabel JPanel textPanel = new JPanel(); JLabel redLabel = new JLabel("Red"); redLabel.setLocation(0, 0); redLabel.setSize(50, 40); textPanel.add(redLabel); textPanel Component: JButton Khởi tạo: String text; Icon image; JButton btn = new JButton(text) JButton btn = new JButton(text,image) JButton btn = new JButton(image) Phương thức: ActionListener listener; boolean b; btn.addActionListener(listener); btn.setEnable(b); Xử lý sự kiện với JButton: Khi một button được click thì phương thức actionPerformed()được thực hiện với một ActionEvent được truyền vào. Ví dụ: JButton btn = new JButton(“Do Something”); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ doMyAction();// khi click vào button } } ); Component: JButton Component: JTextField Các phương thức: JTextField txt = new JTextField(20) ; txt.setText(“Enter here”); Hoặc JTextField txt= new JTextField("Enter here", 20); String str=txt.getText(); txt.addActionListener(listener); txt.setEditable(true/false); txt.setFont(font); txt.setHorizontalAlignment(align); txt.requestFocus();//Đặt con trỏ vào textbox public class textFieldUpperCase extends JFrame { public textFieldUpperCase() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JTextField text = new JTextField(40); text.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ text.setText(text.getText().toUpperCase()); } }); getContentPane().add(text, BorderLayout.NORTH); pack(); setVisible(true); } public static void main(String[] args) { new textFieldUpperCase(); } } Component: JTextField JCheckBox cb; //một checkbox String text; //một giá trị text boolean state; //Giá trị true hoặc false cb = new JCheckBox(text); hoặc cb = new JCheckBox(text,state); state = cb.isSelected(); cb.setSelected(state); cb.addActionListener(listener); cb.addItemListener(itemListener); Component: JCheckBox Xử lý sự kiện khi click vào Checkbox: ActionListener listener = new ActionListener(){ public void actionPerformed(ActionEvent event) { int mode = 0; if (bold.isSelected()) mode += Font.BOLD; if (italic.isSelected()) mode += Font.ITALIC; label.setFont(new Font("Serif", mode, FONTSIZE)); } }; bold.addActionListener(listener); italic.addActionListener(listener); Component: JCheckBox Component: JRadio JRadioButton yesButton = new JRadioButton("Yes" , true); JRadioButton noButton = new JRadioButton("No" , false); JRadioButton maybeButton = new JRadioButton("Maybe", false); ButtonGroup bgroup = new ButtonGroup(); bgroup.add(yesButton); bgroup.add(noButton); bgroup.add(maybeButton); JPanel radioPanel = new JPanel(); radioPanel.setLayout(new GridLayout(3, 1)); radioPanel.add(yesButton); radioPanel.add(noButton); radioPanel.add(maybeButton); radioPanel.setBorder(BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder(), "Married?")); Component: JRadio boolean b; JRadioButton rb = new JRadioButton("Sample", false); Một số phương thức hay dùng: rb.isSelected(); Trả về true nếu nút radio được chọn. rb.setSelected(b); Đặt nút radio là b (true/false). rb.addActionListener(listener); Thêm vào hành động listener cho nút radio. Nếu radio này được chọn thì listener sẽ hoạt động. rb.addItemListener(itemlistener); Thêm vào hành động listener cho nút radio. Nếu radio này được chọn hoặc bỏ chọn thì listener sẽ hoạt động. Component: JList JList() JList(ListModel dataModel) Jlist(Object[] listData) Cú pháp: Component: JList Ví dụ: String names[] = {"Red", "Blue", "Green", "Orange", "Yellow", Pink", "Cyan", "Gray", "Black", "Magenta"}; boxes = new JList(names); boxes.setVisibleRowCount(10); JList boxes; Component: JList JList list; DefaultListModel model; int count = 5; model = new DefaultListModel(); list = new JList(model); JButton addButton = new JButton("Add Element"); for (int i = 0; i < 10; i++) model.addElement("Element " + i); addButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ model.addElement("Element " + counter); counter++; } }); Component: JComboBox Khởi tạo: String[] dias = {"lunes", "martes", "miercoles"}; JComboBox dayChoice = new JComboBox(dias) Giả sử có: int index; String item; String obj; // obj có thể kiểu khác Các phương thức: String JComboBox cb = new JComboBox(...); cb.addActionListener(listener); Component: JComboBox Phương thức Ý nghĩa cb.setSelectedIndex(index) Đặt mục có chỉ sổ là index được chọn. cb.setSelectedItem(obj) Đặt mục obj được chọn. cb.add(item) Thêm vào một item. cb.insert(item,index) Thêm vào item sau vị trí index. cb.remove(item) Xóa mục item khỏi combo box. cb.remove(index) Xóa mục có chỉ số index ra khỏi combo box. index = cb.getSelectedIndex(); Trả về chỉ sổ của mục được chọn. obj = cb.getSelectedItem(); Trả về giá trị của mục đang được chọn. Xử lý sự kiện Một sự kiện thường xảy ra khi có sự thay đổi trong giao diện người dùng đồ họa. Ví dụ như khi người dùng click chuột vào một button, click vào một mục trong combo box và như vậy một sự kiện sẽ được kích hoạt. Các thành phần đồ họa (components) tạo ra các sự kiện này được gọi là ‘nguồn sự kiện’ (event source). Các nguồn sự kiện sẽ gửi đi một đối tượng sự kiện (event object). Các sự kiện được xử lý bởi một sự kiện lắng nghe (event listener) được gán cho nguồn sự kiện. Các thành phần khác nhau của GUI sẽ có các event listener khác nhau. GUI Listeners Program- specific Action handlers Xử lý sự kiện Sự kiện tác động • Xây dựng GUI và kết nối (còn gọi là đăng ký) tới các listeners. • Listener sẽ thực thi (implements) các interface thích hợp với từng loại sự kiện. • Thực hiện các lệnh (trong xử lý sự kiện) phù hợp với nguồn sự kiện. Xử lý sự kiện. Đăng ký Listener Xử lý sự kiện Event Object Interface và method Các method liên kết Event Source ActionEvent interface ActionListener addActionListener JButton actionPerformed(ActionEvent) removeActionListener JCheckBox JComboBox JTextField JRadioButton ItemEvent interface ItemListener addItemListener JCheckBox itemStateChanged(ItemEvent) removeItemListener JRadioButton JComboBox MouseEvent interface MouseListener addMouseListener Được tạo bởi sự kiện mousePressed(MouseEvent) removeMouseListener Mouse của bất kỳ thành mouseReleased(MouseEvent) phần GUI nào. mouseEntered(MouseEvent) mouseExited(MouseEvent) mouseClicked(MouseEvent) Xử lý sự kiện Sử dụng Inner Class Listener có tên: Là cách thường dùng để viết các chương trình nhỏ. Nhiều component có thể dùng chung Inner Class này. Anonymous Inner Class Listeners: Là inner class không đặt tên, thường được dùng cho một component. Class dạng này không được linh hoạt. Top-level Listeners (this): Thường được sử dụng khi có một event source. Xử lý sự kiện import javax.swing.*; import java.awt.event.*; class SomePanel extends JPanel { private JButton myGreetingButton = new JButton("Hello"); private JTextField myGreetingField = new JTextField(20); public SomePanel() { ActionListener doGreeting = new GreetingListener(); myGreetingButton.addActionListener(doGreeting); myGreetingField.addActionListener(doGreeting); // Các lệnh khác } // Inner class tên là GreetingListener private class GreetingListener implements ActionListener { public void actionPerformed(ActionEvent e) { myGreetingField.setText("Guten Tag"); } } } Xử lý sự kiện class myPanel extends JPanel { . . . public MyPanel() { JButton b1 = new JButton("Hello"); b1.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ // Các lệnh xử lý sự kiện cho b1 } } ); ... } Xử lý sự kiện ... class Hello extends JApplet implements ActionListener{ JButton b; ... public void init() { JButton b = new JButton("Hello"); b.addActionListener(this); ... } public void actionPerformed(ActionEvent e) { message = "Hi"; repaint(); } ... } Java Foundation Class (AFC) Abstract Windowing Toolkit (AWT) Swing Các thùng chứa -Containers Các hộp thoại - Dialogs Quản lý Layout Các thành phần GUI – Components Xử lý sự kiện Tổng kết bài học
File đính kèm:
- bai_giang_lap_trinh_java_bai_8_gioi_thieu_ve_swing.pdf