Tuesday, November 24, 2009

Xử lý các sự kiện Trong Java

From: http://www.vn4000.com
http://www.vn4000.com/content/view/4670/35/
Java SE Architecture, source: http://www.oracle.com/technetwork/java/javase/tech/index.html

 Xử lý các sự kiện phần 3

Sự kiện bao gồm rất nhiều hành động như click vào một button như phần trước, nhấn một phím trên keyboard, kéo thả chuột, thêm hay bớt một cái gì trong textfield...
Không phải chỉ duy nhất interface ActionListener quản lý tất cả các sự kiện.
Bạn cần biết interface nào quản lý sự kiện mà bạn muốn xử lý.
Trước hết cần một cái nhìn bao quát, đây là một phần cây phân cấp:
Fig.1 Event processing in Java
Còn đây là một số các "Listener" mà bạn có thể implements để xử lý một sự kiện nào đó.
Fig.2 Event Listeners in Java





Rất nhiều. Bạn vào đây tham khảo. Có lẽ nhìn thôi đã thấy hoa mắt rồi.

Tuy nhiên không nên quá lo lắng, trong lúc này chúng ta cũng chỉ cần quan tâm tới một số Listener mà thôi.

Tất cả bạn đều có thể tham khảo dễ dàng.
  • Các thành phần mà chúng ta có thể dùng ActionListener:


  • Các thành phần mà chúng ta có thể dùng ItemListener:

  • Các thành phần mà chúng ta có thể dùng WindowListener:
  



Chúng ta thêm một ví dụ về ItemListener.
Bạn thêm code sau vào ví dụ trước:
import java.awt.*;
import java.awt.event.*;

class FrameDemo extends Frame implements ActionListener, ItemListener
{
Label label1=new Label("This is just a label");
TextField tf1=new TextField(30);
TextArea ta1=new TextArea();
Button b1 = new Button("My Button");
Checkbox c1=new Checkbox("CheckBox",true);

CheckboxGroup cb=new CheckboxGroup();
Checkbox c2=new Checkbox("Radio 1",cb,true);
Checkbox c3=new Checkbox("Radio 2",cb,false);
Checkbox c4=new Checkbox("Radio 3",cb,false);
Choice ch =new Choice();


public FrameDemo(String title)
{
super(title);
setLayout(new FlowLayout());
add(label1);
add(tf1);
add(ta1);
add(b1);
add(c1);
add(c2);
add(c3);
add(c4);

ch.addItem("White");
ch.addItem("Red");
ch.addItem("Orange");
ch.addItem("Green");
add(ch);
b1.addActionListener(this);
ch.addItemListener(this);

}
public void actionPerformed(ActionEvent ae)
{
if (ae.getSource()==b1)

{

System.exit(0);

}
}
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
System.out.println("Choice has changed!");
}
}


public static void main(String args[])
{
FrameDemo f=new FrameDemo("I have been Frameed!!!");

f.setSize(600,600);
f.setVisible(true);

f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
}
}

Save lại và chạy thử, mỗi khi bạn thay đổi Choice ch, ví dụ từ White qua Red, bạn sẽ thấy dòng chữ "Choice has changed".
Bạn vào đây tham khảo interface ItemListener.
Như bạn thấy, cũng tương tự như ActionListener, chỉ có một method itemStateChanged(ItemEvent e) trong interface ItemListener. Trong method này có một tham số ItemEvent.
Bạn vào đây tham khảo lớp ItemEvent. Để biết thành phần nào trong Choice được chọn, chúng ta dùng method getStateChange().
Mọi cái còn lại cũng như ví dụ trước.

Component

Các component gồm nhiều loại, hình dưới đây sẽ giúp chúng ta có một cái nhìn bao quát nhất về component.
Fig.3 Components in Java
 

 
Cách tốt nhất theo chúng tôi là cứ thử trước, sau đó chúng ta sẽ bàn tới từng Component.
Nhưng việc đầu tiên của chúng ta cần giải quyết trước khi đặt các Component vào Container là việc đóng Frame.
Sau này khi qua phần Swing bạn sẽ có cách khác cách chúng ta sẽ bàn đây. Tuy nhiên dù là AWT hay Swing thì bạn phải luôn nhớ vấn đề này.
Với AWT, bạn có hai cách viết, hoàn toàn có chức năng như nhau.
Cách 1

Cách này chỉ để bạn hiểu mà thôi. Trước hết ta thấy việc click vào [x] để đóng một cửa sổ là một sự kiện (Event) vì vậy ta cần 
import java.awt.event.*;   Tiếp theo, chúng ta có interface  java.awt.event.WindowListener. Đây là interface dùng để "lắng nghe" những sự kiện xảy ra trên những AWT Component . Vậy để xử dụng thì chúng ta sẽ implements interface này.
Bạn vào đây tham khảo java.awt.event.WindowListener.

Như bạn thấy, trong interface này có tổng cộng 7 method, dù có xử dụng hay không việc đầu tiên là chúng ta phải định nghĩa tất cả 7 method đó.
Tạm thời code của chúng ta sẽ thế này: 
 
import java.awt.Frame;
import java.awt.event.*;

class FrameDemo extends Frame implements WindowListener
{
public FrameDemo(String title)
{
super(title);
}
public  void windowActivated(WindowEvent e){}
public  void windowClosed(WindowEvent e){}
public  void windowClosing(WindowEvent e){}
public  void windowDeactivated(WindowEvent e){}
public  void windowDeiconified(WindowEvent e){}
public  void windowIconified(WindowEvent e){}
public  void windowOpened(WindowEvent e){}
public static void main(String args[])

{
FrameDemo f=new FrameDemo("I have been Frameed!!!");

f.setSize(300,200);
f.setVisible(true);

}
}


Bây giờ là lúc chúng ta phải xử lý sự kiện click vào [x] để đóng một cửa sổ. Và Method mà chúng ta sẽ "chế biến" chính là public  void windowClosing(WindowEvent e). Nhưng trước hết bạn phải gắn máy "nghe lén" vào bằng lệnh:
addWindowListener(this);
Sau đó thì mặc sức "thêm mắm thêm muối". Tạm thời để thử máy nghe lén có hoạt động không bạn thêm lệnh System.out.println("Hello"); vào rồi chạy thử:
import java.awt.Frame;
import java.awt.event.*;

class FrameDemo extends Frame implements WindowListener
{
public FrameDemo(String title)
{
  super(title);
  addWindowListener(this);

}
public  void windowActivated(WindowEvent e){}
public  void windowClosed(WindowEvent e){}
public  void windowClosing(WindowEvent e){
    System.out.println("Hello");
}
public  void windowDeactivated(WindowEvent e){}
public  void windowDeiconified(WindowEvent e){}
public  void windowIconified(WindowEvent e){}
public  void windowOpened(WindowEvent e){}
public static void main(String args[])
{
FrameDemo f=new FrameDemo("I have been Frameed!!!");

f.setSize(300,200);
f.setVisible(true);

}
}


Nếu mỗi lần bạn click vào [x] và thấy chữ Hello thì coi như ổn rồi. Hãyđóng Frame lại bằng cách click vào ô vuông màu đỏ.
Bây giờ bạn chỉ việc thay System.out.println("Hello") bằng lệnh System.exit(0) là xong. Lưu ý trong lệnh exit là số 0 chứ không phải chữ O. Vì sao lại là số 0? Có lẽ bạn thử Google cụm từ "exit codes" xem. Đại khái là "Đã hoàn tất việc thoát khỏi chương trình!"Laughing
import java.awt.Frame;
import java.awt.event.*;

class FrameDemo extends Frame implements WindowListener
{
public FrameDemo(String title)
{
  super(title);
  addWindowListener(this);

}
public  void windowActivated(WindowEvent e){}
public  void windowClosed(WindowEvent e){}
public  void windowClosing(WindowEvent e){
    System.exit(0);
}
public  void windowDeactivated(WindowEvent e){}
public  void windowDeiconified(WindowEvent e){}
public  void windowIconified(WindowEvent e){}
public  void windowOpened(WindowEvent e){}
public static void main(String args[])
{
FrameDemo f=new FrameDemo("I have been Frameed!!!");

f.setSize(300,200);
f.setVisible(true);

}
}


Giờ đây bạn đã có thể đóng Frame lại được rồi!


Cách 2
Chúng tôi muốn bạn dựa trên phân tích của cách 1 để tìm hiểu về cách 2. Đây là code, với bộ khung của Frame, bạn chỉ thêm vài dòng mà thôi:
import java.awt.Frame;
import java.awt.event.*;

class FrameDemo extends Frame
{
public FrameDemo(String title)
{
super(title);
}
public static void main(String args[])
{
FrameDemo f=new FrameDemo("I have been Frameed!!!");

f.setSize(300,200);
f.setVisible(true);

f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent we){
      System.exit(0);
    }
  });
}


}

Chúng ta tạm dừng ở đây. Phần sau chúng ta sẽ tiếp tục với các Component

2 comments: