Thursday, 11 November 2010

JAVA DESKTOP TỪ A ------...------> Z - kỳ 1

. Tại sao chọn Java làm Desktop app?

Ngày xưa, lâu lắm rồi không nhớ rõ. Khi đó tôi mới ra trường và xin vào viết phần mềm quản lý cho 1 công ty. Trong version 1 tôi dùng VC++ 6 (Tui không khoái VB), MS SQL Server 2000 và Crystal report 8. Sau đó 1 năm thì tôi lên kế hoạch nâng cấp phần mềm lên version 2. Lúc đó cũng muốn học hỏi ngôn ngữ mới nên hơi bâng khuâng giữa .NET và Java. Để giải tỏa, tôi phải buộc phải làm 2 cái demo và trải qua thời gian gần 2 tuần để so sánh 2 ngôn ngữ này và cuối cùng là quyết định chọn Java (Version 1.3). Và version 2 của Project phát triển trên Java 1.3, Oracle 8i và JFreeReport.

Lúc mới start tôi hơi lo lắng về mức độ thành công của Project này, nhưng thật bất ngờ, kết quả tuyệt vời hơn mong đợi (Đó là đánh giá của khách hàng). Từ đó về sau tôi chọn Java để viết tất cả các ứng dụng Desktop (trên 10 apps), vì vậy mới có ngày hôm nay "Tham gia cuộc thi Java Desktop"

Ứng dụng Desktop viết bằng Java có những đặc điểm sau:

*

Cực kỳ ổn định, không bị lỗi tắt ngang giữa chừng như ứng dụng viết bằng .NET, VB, Delphi
*

Giao diện đẹp (không hè thua kém anh bạn .NET, nhiều khi còn trội hơn nữa là khác)
*

Giao diện không phụ thuộc độ phân giải màn hình (Thích hợp cho các LCD ngày càng rộng lớn)
*

Không phụ thuộc nền, CSDL (đáng giá ngàn vàng, nhất là khi gia nhập WTO)
*

Tốc độ thực thi hơi chậm, nhưng không đáng ngại lắm, hơi chậm tí thôi, có cách làm cho nó chạy nhanh hơn (Đón đọc tips: Tăng tốc load ứng dụng Swing)
*

Dễ bảo trì, nhất là GUI
*

Nhiều tools open source để lựa chọn
*

Report động bằng code Java (Không biết .NET có tools report nào như vậy không)
*

Một tính năng khác, có lẽ các bạn không tin! đó là "Hình như không bị nhiễm Virus" (Tình cờ phát hiện thôi)
*

Phát triển rất nhanh vì chúng ta có những framework hỗ trợ: NetBean Platform, Eclipse Platform và Spring Rich Client Platform, ...

Mặc dù phần này có tiêu đề là "Xây dựng giao diện với Swing", nhưng tôi sẽ trình bày thêm những phần khác để các bạn có thể hình dung những bước phải làm để có 1 sản phẩm "tí hon".

Không cần biết phần mềm của chúng ta sử dụng thuật giải cao siêu gì, thông minh đến đâu, nhưng 1 điều chắc chắn là nếu phát triển trên nền Command line (console), toàn 1 màu đen thui thì chỉ có mấy anh em họ *nix mới có thể sử dụng được, sở dĩ MS thành công như ngày nay không phải tại IBM và Apple ngu không đâu mà cũng nhờ 1 phần vào những phần mềm của họ có GUI thân thiện. Vì vậy GUI của phần mềm quan trọng như mấy em tiếp viên của quán café vậy!
2. Qua bài viết này bạn có thể làm được những gì?

*

Nắm được những điểm mạnh/yếu của Java Desktop
*

Hình dung được 1 cách tổng quan để lựa chọn những kỹ thuật thiết kế GUI trong Java.
*

Biết được Swing hỗ trợ những components nào.
*

Nắm vững khái niệm cực lợi hại "Layout" (ngày xưa tôi chọn Java cũng vì thằng này đây).
*

Hình dung được cách xây dựng 1 phần mềm "bé xíu"
*

Và phần cuối cùng là deploy ứng dụng tới end user
*

Demo: Xây dựng ứng dụng Mã hóa/giải mã password (bé như hạt cát trên sa mạc), xem screenshot

Hình : http://www.pissoft.com/javavietnam/articles/javadesktop/session1/demo.jpg

Online demo đây nè: With LookAndFeel | Without LookAndFeel

http://www.pissoft.com/javavietnam/articles/javadesktop/session1/encrypt.jnlp

http://www.pissoft.com/javavietnam/articles/javadesktop/session1/no-laf-encrypt.jnlp
3. Giới thiệu sơ lượt các swing components

Làm phần mềm cũng tương tự như xây 1 lâu đài tình ái (xây trên cát), xây nhà cần có KTS, Thợ, gạch, cát, ... thì làm phần mềm cũng cần phải có KST, LTV, ... và Components (những thành phần xây dựng nên GUI)

Khi xây dựng GUI trên môi trường .NET, các bạn hình như chỉ có 1 sự lựa chọn duy nhất đó là sử dụng các Components có sẵn của VS.NET (hoặc sử dụng các components của nhà sản xuất thứ 3 - nhưng cũng kế thừa từ ... dòng họ MS).

Đối với Java thì bạn có nhiều lựa chọn hơn, đôi khi cũng làm bạn đau đầu hơn, đó là:

*

AWT: Tiền bối của Java, bây giờ chỉ còn sử dụng cho applet
*

Swing: Thư viện này vô cùng mạnh mẽ và được được sử dụng nhiều nhất hiện nay
*

SWT: Thư viện này cũng khá mạnh mẽ nhưng lại của IBM (Eclipse sử dụng SWT để buid GUI), nên được sử dụng ít hơn Swing
*

Thinlet: Đây là thư viện nhỏ nhất trong tất cả các thư viện GUI (thư viện chỉ 36KB, không kế thừa từ Swing hay AWT, chạy rất nhanh, source code chỉ có 1 file duy nhất), components cũng hạn chế, thường được sử dụng cho applet nhưng viết bằng XML
*

Còn nhiều thư viện khác nữa, và người ta còn có xu hướng xây dựng GUI thông qua XML.

Mỗi thư viện có 1 thế mạnh riêng, mình không có thời gian trình bày hết nên chỉ chọn Swing để trình bày vì nó mạnh mẽ, thông dụng nhất.

Sau đây là danh sách những components chuẩn của Swing: Các Components trong Swing người ta thường chia ra làm 3 loại:

*

Window (cũng là 1 loại container)
*

Compoent
*

Container: dùng chứa components khác

Nhưng sự phân chia này chỉ mang tính tương đối, vì trong Swing, mọi Components đều có thể làm Container được!

Window:

*

JWindow: Là 1 cửa sổ trụi lủi, không có title bar gì cả
*

JFrame: Đây chính là cửa sổ chính
*

JDialog: Hộp thoại
*

JFileChooser: Hộp thoại chọn file
*

JColorChooser: Hộp thoại chọn màu
*

...

Đoạn code sau minh họa cách sử dụng JFrame

public class MyFrame extends JFrame{

public MyFrame(){

super("JFrame demo");

setSize(800, 600);

setVisible(true);

}


public static void main(String args[]){

new MyFrame();

}

}

Online demo

http://www.pissoft.com/javavietnam/articles/javadesktop/session1/frame.jnlp

Components:

Cái này quen quá nên khỏi giải thích

*

JLabel
*

JButton
*

JCheckBox
*

JRadio
*

JTextField
*

JTextArea
*

JTextPane
*

JEditorPane
*

JComboBox
*

JList
*

JTree
*

JTable
*

JMenuItem
*

JMenu
*

...

Containers:

*

Container
*

JPanel
*

JScrollPane
*

JSplitPane
*

JMenuBar
*

...

Còn đây là những components mở rộng (đón đọc phần 3 - customize Swing components):

*

TreeComboBox
*

CheckList
*

CheckTree
*

TaskPane
*

PopupButton
*

DatePicker
*

....
*

Còn vô vàn những components khác, nhu cầu con người vốn dĩ đa dạng mà!

Đoạn code sau minh họa cách sử dụng 1 component nào đó, Ví dụ JTextPane

Sẵn đây minh họa luôn cách xem 1 trang web trong Java

import java.io.IOException;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextPane;

public class JavaWebBrowser extends JFrame {

public JavaWebBrowser() {

super("Java Web Browser Demo");

setSize(800, 600);



JTextPane txtWebBrowser = new JTextPane();

txtWebBrowser.setEditable(false);

try {

txtWebBrowser.setPage("http://www.google.com");

} catch (IOException e) {

e.printStackTrace();

}



add(new JScrollPane(txtWebBrowser));

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

}



public static void main(String args[]) {

new JavaWebBrowser();

}

}

Screenshot:

Hình : http://www.pissoft.com/javavietnam/articles/javadesktop/session1/web-browser.jpg

Online demo

http://www.pissoft.com/javavietnam/articles/javadesktop/session1/web-browser.jnlp

(Nếu không chạy được online demo, bạn download file .jar tại đây, nhớ rename thành .jar trước khi thực thi)

http://www.pissoft.com/javavietnam/articles/javadesktop/session1/web-browser.jar
4. Tìm hiểu Layout

Việc thiết kế giao diện chỉ đơn giản là việc đặt các components lên Form ở những tọa độ thích hợp. Cách tiếp cận này có 1 nhược điểm khá lớn: tạo cho GUI cứng ngắt. Còn GUI của Java (Swing) tiếp cận theo hướng hoàn toàn khác, rất ấn tượng đó là "Layout". Vậy Layout là gì?

Layout là cách bố trí các components trên Form theo 1 ràng buộc hay sự tương quan nào đó mà không hoàn toàn dựa vào tọa độ, nghe có vẻ khó hiểu quá! (từ từ thấm). Điều này làm cho giao diện thiết kế bằng Java rất mềm dẻo, không phụ thuộc vào độ phân giải màn hình là ở chỗ này đấy.

(Tạm thời bạn cứ chấp nhận khái niệm Layout đại khái như thế thôi, khi đọc xong hết phần này tự nhiên bạn sẽ hiểu)

Trong AWT, Swing có rất nhiều Layout khác nhau, lựa chọn Layout nào là tùy thuộc vào từng ngữ cảnh cụ thế hoặc là ta có thể trộn nhiều layout lại với nhau. Sau đây là danh sách các layout:

*

CardLayout: Như tên của loại layout này cũng nói lên được ý nghĩa của nó, khi ta đặt các components lên form có layout là CardLayout, thì cùng lúc ta chỉ thấy 1 components, giống như TabPane vậy! Hay đơn giản là các components chia sẻ nhau vùng hiển thị.
*

BorderLayout: Loại layout này chia container ra làm 5 vùng: giữa (CENTER), trái (LINE_START), phải(LINE_END), trên(PAGE_START), dưới(PAGE_END). Vùng giữa giãn theo 2 chiều rộng và cao, vùng trái và phải chỉ giãn theo chiều cao, vùng trên và dưới chỉ giãn theo chiều ngang.
*

BoxLayout: Đặt các components theo dòng hoặc cột, xếp liên tiêp nhau.
*

FlowLayout: Tương tự BoxLayout, nhưng có thể nằm trên nhiều dòng và nhiều cột, khi đầy dòng/cột thì sang dòng/cột mới. kích thước các components có thể khác nhau.
*

GridLayout: Layout này được tổ chức theo dạng lưới n dòng và m cột, mỗi component nằm trọn vẹn trong 1 cell. GridLayout chỉ thích hợp cho các ứng dụng có Layout giống như dò mìn hoặc caro.
*

GridBagLayout: Đây là loại Layout mềm dẻo nhất (Bác sĩ khuyên dùng), nhưng cũng khó sử dụng nhất. Nó cũng dựa trên tư tưởng của GridLayout, nhưng cho phép 1 components chiếm (merge) nhiều ô (cell) của lưới, và sự co giãn của các cell cũng khác nhau.
*

SpringLayout: Khi ta đặt components lên form có Layout là SpringLayout thì vị trí và kích thước của component sẽ được xác định dựa vào sự tương quan giữa compoent này với các components xung quanh nó
*

null layout: không sử dụng Layout, quay về thời kỳ đồ đá giống GUI được thiết kế bằng VB, VC, Delphi, .NET,... đặt các components theo tọa độ cố định
*

: và dĩ nhiên bạn cũng có thể chế tác thêm vài layout nữa

Mặc dù có nhiều loại Layout, nhưng ta chỉ cần sử dụng 4 loại là có thể xây dựng được tất cả các loại GUI phức tạp nhất. Đó là: GridBagLayout, BoxLayout, BorderLayout, CardLayout

Sau đây tôi sẽ trình bày cách sử dụng 4 loại layout này

Sử dụng BorderLayout

public class BorderLayoutDemo extends JFrame {

public BorderLayoutDemo() {

super("BorderLayout Demo");

setSize(800, 600);



buidGUI();



setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

}


private void buidGUI(){

setLayout(new BorderLayout());

//set layout cho contentPane của Frame



JTable tbl = new JTable(10, 10);

tbl.setValueAt("CENTER", 9, 5);



//đặt các components vào từng vùng tương ứng

add(new JScrollPane(tbl), BorderLayout.CENTER);

add(new JButton("PAGE_START"), BorderLayout.PAGE_START);

add(new JLabel("Status bar here...(PAGE_END)"),BorderLayout.PAGE_END);

}



public static void main(String args[]) {

new BorderLayoutDemo();

}

}


Screenshot:

Hình : http://www.pissoft.com/javavietnam/articles/javadesktop/session1/border-layout.jpg

Online demo

http://www.pissoft.com/javavietnam/articles/javadesktop/session1/border-layout.jnlp

Sử dụng CardLayout & GridLayout

Sẵn đây trình bày cách sử dụng Menu luôn

public class CardLayoutDemo extends JFrame {

private JRadioButtonMenuItem itmSimple = newJRadioButtonMenuItem("Simple", true);

private JRadioButtonMenuItem itmComplex = newJRadioButtonMenuItem("Complex");

private CardLayout cardLayout = new CardLayout();



public CardLayoutDemo() {

super("CardLayout & GridLayout Demo");

setSize(800, 600);



buidGUI();

registerListener();



setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

}



private void buidGUI(){

JMenuBar menuBar = new JMenuBar();

setJMenuBar(menuBar);

JMenu mnuLayout = new JMenu("Layout");

menuBar.add(mnuLayout);



ButtonGroup layoutGroup = new ButtonGroup();

layoutGroup.add(itmSimple);

layoutGroup.add(itmComplex);



mnuLayout.add(itmSimple);

mnuLayout.add(itmComplex);



JPanel pnlSimple = new JPanel();

pnlSimple.setLayout(new BorderLayout());

pnlSimple.add(new JTextField("Simple Form"), BorderLayout.CENTER);

pnlSimple.setBackground(Color.GREEN);



JPanel pnlComplex = new JPanel();

pnlComplex.setLayout(new GridLayout(5, 5));

for(int i=0 ;i < 5; i++) for(int j=0; j < 5; j++) pnlComplex.add(new JButton(i + "x" + j)); pnlComplex.setBackground(Color.RED); setLayout(cardLayout); add("simple", pnlSimple); add("complex", pnlComplex); } //tạm thời chưa quan tâm đến sự kiện private void registerListener(){ itmSimple.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { cardLayout.show(getContentPane(), "simple"); } }); itmComplex.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { cardLayout.show(getContentPane(), "complex"); } }); } public static void main(String args[]) { new CardLayoutDemo(); } } Screenshot: Hình http://www.pissoft.com/javavietnam/articles/javadesktop/session1/card-layout.jpg Online demo http://www.pissoft.com/javavietnam/articles/javadesktop/session1/card-layout.jnlp Sử dụng GridBagLayout & BoxLayout Như trên có đề cập, GridBagLayout là layout mềm dẻo và phức tạp nhất. Nó xác định vị trí và kích thước components thông qua đối tượng thuộc lớp GridBagConstraints. Sau đây minh họa cách thiết kế form nhập hồ sơ nhân viên public class GridBagLayoutDemo extends JFrame { public GridBagLayoutDemo() { super("GridBagLayout & BoxLayout Demo"); setSize(800, 600); buidGUI(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } private void buidGUI(){ JLabel lblID = new JLabel("Emp ID: ", JLabel.RIGHT); JTextField txtID = new JTextField(); JLabel lblFullName = new JLabel("Full Name: ", JLabel.RIGHT); JTextField txtFullName = new JTextField(); JLabel lblGender = new JLabel("Gender: ", JLabel.RIGHT); JComboBox cbGender = new JComboBox(new String[]{"Male", "Female"}); JLabel lblAddr = new JLabel("Address: ", JLabel.RIGHT); JTextField txtAdrr = new JTextField(); JButton btnFind = new JButton("Find"); JButton btnNew = new JButton("New"); JButton btnSave = new JButton("Save"); JButton btnDelete = new JButton("Delete"); JButton btnHelp = new JButton("Help"); setLayout(new GridBagLayout()); /*Do đối tượng GridBagConstaints tương đối phức tạp, để tránh lặp code, ta viết sẵn 3 phương thức * createFixedHorzConstraints: Tạo ràng buộc không co giãn (Label) * createHorzConstraints: Tạo ràng buộc co giãn theo chiều ngang (TextField) * createBothHorzConstraints: Tạo ràng buộc co giãn theo 2 chiều (Table) */ add(lblID, createFixedHorzConstraints(0, 0, 1, 1)); add(txtID, createHorzConstraints(1, 0, 1, 1, 0.3)); add(lblFullName, createFixedHorzConstraints(2, 0, 1, 1)); add(txtFullName, createHorzConstraints(3, 0, 1, 1, 1)); add(lblGender, createFixedHorzConstraints(4, 0, 1, 1)); add(cbGender, createHorzConstraints(5, 0, 1, 1, 0.3)); add(lblAddr, createFixedHorzConstraints(0, 1, 1, 1)); add(txtAdrr, createHorzConstraints(1, 1, 5, 1, 1)); JPanel pnlController = new JPanel(); add(pnlController, createHorzConstraints(0, 2, 6, 1, 1)); pnlController.setLayout(new BoxLayout(pnlController, BoxLayout.X_AXIS)); pnlController.add(btnFind); pnlController.add(Box.createHorizontalGlue());//phân chia nhóm pnlController.add(btnNew); pnlController.add(btnSave); pnlController.add(btnDelete); pnlController.add(Box.createHorizontalGlue());//phân chia nhóm pnlController.add(btnHelp); add(new JLabel("Available list: "),createFixedHorzConstraints(0, 3, 6, 1)); add(new JScrollPane(new JTable(100, 10)),createBothConstraints(0, 4, 6, 1, 1, 1)); } public static void main(String args[]) { //Tạm thời chưa cần biết LookAndFeel try { UIManager.setLookAndFeel("de.muntjak.tinylookandfeel.TinyLookAndFeel"); } catch (Exception e) { e.printStackTrace(); } new GridBagLayoutDemo(); } public static GridBagConstraints createFixedHorzConstraints(int gridx,int gridy, int gridwidth, int gridheight) { return new GridBagConstraints(gridx, gridy, gridwidth, gridheight,0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,new Insets(1, 12, 1, 2), 0, 0); } public static GridBagConstraints createHorzConstraints(int gridx,int gridy, int gridwidth, int gridheight, double weightx) { return new GridBagConstraints(gridx, gridy, gridwidth, gridheight,weightx, 0.0, GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL, new Insets(1, 0, 1, 0), 0, 0); } public static GridBagConstraints createBothConstraints(int gridx,int gridy, int gridwidth, int gridheight,double weightx, double heightx) { return new GridBagConstraints(gridx, gridy, gridwidth, gridheight,weightx, heightx, GridBagConstraints.CENTER,GridBagConstraints.BOTH, new Insets(1, 0, 1, 0), 0, 0); } } Screenshot: Hình http://www.pissoft.com/javavietnam/articles/javadesktop/session1/grid-bag-layout.jpg Online demo with LaF http://www.pissoft.com/javavietnam/articles/javadesktop/session1/grid-bag-layout.jnlp Online demo without LaF http://www.pissoft.com/javavietnam/articles/javadesktop/session1/no-laf-grid-bag-layout.jnlp Quá nhiều rồi, tạm gác Layout lại bây giờ ta chuyển sang tìm hiểu Event và Listner 5. Tìm hiểu về Event Event là gì? Rất đơn giản, event là sự kiện. Vậy thực chất sự kiện là gì? Sự kiện là 1 cái gì đó xảy ra khi có yếu tố nội bộ hoặc ngoại cảnh tác động lên nó (rất trừu tượng) Lấy 1 số ví dụ sau nhé * Sự kiện Quốc tế phụ nữ vào ngày 8/3 hàng năm (Sự kiện thời gian) * Sự kiện sập tòa tháp đôi (Sự kiện Khủng bố) Ủa, Quốc tế phụ nữ hay sập tòa tháp đôi liên quan gì đến Java? Dĩ nhiên trong ngành phần mềm có những sự kiện riêng của nó. Sau đây là 1 số sự kiện cơ bản: * KeyEvent: Xảy ra khi nhấn bàn phím * MouseEvent: Xảy ra khi nhấn chuột * ActionEvent: Xảy ra khi có 1 hành động nào đó tác động: Click vào nút, chọn xong 1 item trong combobox, ... * WindowEvent: Sự kiện liên quan đến Window: closed, opened, closing, ... * FocusEvent: Liên quan đến focus và lost fucus * ... Còn rất nhiều sự kiện khác, các bạn tìm hiểu thêm trong Javadoc * , dĩ nhiên bạn cũng có thể tự định nghĩa thêm sự kiện mới phục vụ cho nhu cầu của mình (Xem phần 2)



Trong Java mọi sự kiện đều kế thừa trực tiếp hoặc gián tiếp từ lớp EventObject

Tuy nhiên, thật là đơn điệu nếu ngày 8/3 không ai mong đợi hay đón nhận, thì nó chẳng khác gì ngày bình thường! Thông thường một khi đã có Sự kiện thì sẽ có sự Đón nhận, giống như các em thiếu nhi mong chờ sự kiện Quốc tế thiếu nhi để nhận quà. Trong phần mềm cũng thế 1 khi có sự kiện thì phải có sự đón nhận sự kiện hay Lắng nghe (Listener).

Ví dụ, khi có sự kiện mouse click lên 1 nút lệnh nào đó, thì phải có Sự lắng nghe (Listener) để khi click vô nút lệnh nó sẽ gọi phương thức xử lý tương ứng

Trong java, Event và Listener được sử dụng như thế nào? Thông thường Event ta không quan tâm, vì chúng được các Components lo rồi, ta chỉ quan tâm khâu đăng ký lắng nghe sự kiện và phương thức xử lý sự kiện.

Tại sao phải đăng ký lắng nghe sự kiện? Để trả lời câu hỏi này tôi xin lấy 1 ví dụ: Đặt báo PC World Việt nam, quá trình được diễn ra như sau:

*

Lên tòa soạn và đăng ký đặt mua PC World và dĩ nhiên phải trả tiền (Đăng ký lắng nghe sự kiện)
*

Thông thường cứ tới giữa tháng (sự kiện thới gian) sẽ có 1 nhân viên nữ xinh đẹp của tòa soạn PC World mang báo đến cho bạn và bạn là người ra nhận báo (Xử lý sự kiện)

Tóm lại, việc sử dụng Event và listener trong AWT, Swing như sau: (Có 2 cách)

Cách 1: Implements interface XxxListener

public class TestEventAndListener extends JFrame implements ActionListener{

public TestEventAndListener(){

super("Event and Listener Demo");//đặt tiêu đề cho frame



JButton btnStudy = new JButton("Study J2SE");

btnStudy.addActionListener(this);

//đăng ký lắng nghe sự kiện



setLayout(new BorderLayout());

//set BorderLayout cho ContentPane của frame

add(btnStudy, BorderLayout.CENTER);

//đăt nút lệnh tại vùng CENTER


pack();//điều chỉnh kích thích frame vừa đủ chứa các components

setVisible(true);//hiển thị frame

}



/*

* Khi có sự kiện mouse click lên nút btnStudy xảy ra thì phương thức này được gọi

*/

public void actionPerformed(ActionEvent event){

JOptionPane.showMessageDialog(this, "Study, study and studymore", "Action Event", JOptionPane.INFORMATION_MESSAGE);

}


public static void main(String args[]){

new TestEventAndListener();

}

}


Online demo

http://www.pissoft.com/javavietnam/articles/javadesktop/session1/event-listener.jnlp



Rõ ràng như bạn thấy đó, cách này không được hay lắm, giả sử interface XxxListner có nhiều method thì sao? Thì ta phải định nghĩa lại tất cả chúng (chỉ định định nghĩa prototype, không cần nội dung). Chính vì vậy, người ta (Sun chứ ai) mới đưa ra cách chặn sự kiến mới như sau:

Thay vì XxxListener là interface, ta chuyển đó thành XxxAdapter implements interface XxxListener.

Ví dụ interface WindowListener, sẽ tương ứng là WindowAdapter, được định nghĩa như sau:

public class WindowAdapter implements WindowListener{

public void windowOpened(WindowEvent e) {

}


public void windowClosing(WindowEvent e) {

}


public void windowClosed(WindowEvent e) {

}


public void windowIconified(WindowEvent e) {

}



public void windowDeiconified(WindowEvent e) {

}


public void windowActivated(WindowEvent e) {

}


public void windowDeactivated(WindowEvent e) {

}

}

Trên đây là mã nguồn của lớp WindowAdapter. Tuy nhiên Sun đã thực hiện hết dùm ta, chỉ việc sử dụng thôi


Cách 2: Kế thừ từ lớp XxxAdapter

Sau đây là ví dụ chặn sự kiện đóng Frame. Khi đó frame, hỏi ta có muốn đóng hay không?

public class WindowClosingDemo extends JFrame{

public WindowClosingDemo() {

super("Window closing demo");

setSize(800, 600);



registerListener();



setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

setVisible(true);

}



private void registerListener(){

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e) {

int result = JoptionPane.showConfirmDialog(WindowClosingDemo.this, "Do you want to leave me?","Exit App", JOptionPane.YES_NO_OPTION);

if(result==JOptionPane.YES_OPTION)

System.exit(0);

}

});

}



public static void main(String args[]) {

new WindowClosingDemo();

}

}



Online demo

http://www.pissoft.com/javavietnam/articles/javadesktop/session1/window-closing.jnlp



Sự kiện và lắng nghe sự kiện nhiêu đây chắc tạm đủ, mời bạn relax với Splashscreen

No comments:

Post a Comment