事件和事件來源:
事件可以定義為程式發生了某些事情的訊號.能建立一個事件並觸發該事件的組件稱為該事件的來源物件或源組件.事件類別的根類是java.util.EventObject事件對象包括與事件相關的一切屬性,可以使用EventObject中的執行個體方法getSource()獲得事件的來源物件。EventObject的子類的對象處理特定類型的事件。如動作事件,視窗事件,組件事件,滑鼠事件,按鍵事件。java使用一種基於委託的模型來處理事件:原對象觸發一個事件,對此事件感興趣的對象來處理它。將對此事件感興趣的對象稱為監聽器(listener)一個對象要成為原對象上的事件監聽器,需要具備兩個條件。(1)調用source.addXListener(listener)來註冊一個執行個體。註冊方法依賴於事件的類型。如果事件類型是ACtionEvent,那麼對應的註冊方法是addActionListener.一般來說XEvent的註冊命名方法是addXListener.一個來源物件可以觸發幾種類型的事件。(2)要定義監聽器對象的類,確保監聽器有處理這個事件的正確方法。java為每一種類型的事件都提供了監聽器介面。通常XEvent的監聽器介面是XListener,監聽器MouseMotionListener例外。ActionListener的每個 監聽器都應該實現ActionListener介面。註冊一個監聽器: JButton jbtOK = new JButton("OK"); ActionListener listener1 = new OKListenerClass(); jbtOK.addActionListener(listener1);事件對象包含於事件相關的資訊,為判斷一個對象是按鈕,複選框還是選項按鈕,,都可以使用e.getSource()方法獲得來源物件。寫一個程式用兩個按鈕控制圓的大小(1)定義名為EnlargeListener的監聽類,實現ActionListener(2)建立一個監聽器,並將其註冊到jbtEnlarge(3)在CirclePanel中添加一個名為enlarge()的方法來增加半徑,然後重繪(4)實現EnlargeListener中的actionPerformed方法來調用canvas.enlarge()(5)為了讓actionPerformed方法能夠訪問引用變數canvas,將EnlargeListener定義為ControlCircle類的內部類
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ControlCircle extends JFrame
{
private JButton jbtEnlarge =
new JButton("Enlarge");
private JButton jbtShrink =
new JButton("Shrink");
private CirclePanel canvas =
new CirclePanel();
public ControlCircle(){ JPanel panel =
new JPanel(); panel.add( jbtEnlarge); panel.add( jbtShrink);
this.add(canvas ,BorderLayout.
CENTER);
this.add(panel,BorderLayout.
SOUTH); jbtEnlarge.addActionListener(
new EnlargeListener()); }
public static void main(String[]
args){ JFrame frame =
new ControlCircle(); frame.setTitle( "ControlCircle"); frame.setLocationRelativeTo(
null); frame.setSize(200,200); frame.setDefaultCloseOperation(JFrame.
EXIT_ON_CLOSE); frame.setVisible(
true); }
class EnlargeListener
implements ActionListener{
public void actionPerformed(ActionEvent
e){ canvas.enlarge(); } }
class CirclePanel extends JPanel{
private int radius =
5;
public void enlarge(){ radius++; repaint(); }
protected void paintComponent(Graphics
g){
super.paintComponents(g); g.drawOval(getWidth()/2 - radius,getHeight()/2
- radius, 2 * radius,
2 * radius ); } }}
內部類: 定義在另一個類範圍內的類成為內部類。內部類可以像常規類一樣使用。如果內部類只是被外部類使用,那就將該類定義為內部類。內部類可以引用定義在它所嵌套的外部類中的資料和方法內部類的對象經常在外部類中建立內部類的應用就是將從屬類合并到主類中,可以減少源檔案數量,便於管理