2007年11月10日 星期六

Head First Java 讀後整理(9) - A Very Graphic Story

1、JFrame 是個代表畫面上的 window 物件,一旦建構出 JFrame 後,就可以把 widget 加到上面
import javax.swing.*;   //這個 package 是一定要 import 的!
public class SimpleGui1 {
public static void main(String[] args) {
//這就是 JFrame 啦!!
JFrame frame = new JFrame();
//這就是其中一個 widget
//還有其他像是 JRadioButton、JCheckBox、JLabel、JList .... etc
JButton button = new JButton("Click Me");
//設定關閉視窗後的動作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//將 widget 加入 JFrame 中
frame.getContentPane().add(button);
//設定視窗大小並顯示
frame.setSize(300, 300);
frame.setVisible(true);
}
}

2、要讓 Button 在使用者按下後執行特定工作,需要:
  • 被按下時要執行的 method
  • 能夠偵測到按鈕被按下的方法(也就是按鈕的感應裝置)

3、取得與處理使用者動作事件的過程,稱為 Event-Handling (事件處理)

4、Listener interface 是介於 listener(程式設計師) 與事件來源(例如:按鈕)間的橋樑
換句話說,如果想要知道按鈕的事件,就必須實作 listen 該事件的 interface。例如:想要接收 MouseEvent 就必須實作 MouseListener interface;要接收 WindowEvent 就要實作 WindowListener interface。

5、取得按鈕的 ActionEvent
  • 實作 ActionListener interface
  • 向按鈕登記 (告訴按鈕你要 listen 事件)
  • 定義事件處理的 method (其實就是實作 interface 上的 method)
import javax.swing.*;   //繪製圖形用的 package
import java.awt.event.*; //處理事件用的 package
//實作 ActionLister interface
//表示 SimpleBui1B 是個 ActionListener(事件只會通知有實作 ActionListener 的 class)
public class SimpleGui1B implements ActionListener {
JButton button;

public static void main(String[] args) {
SimpleGui1B gui = new SimpleGui1B();
gui.go();
}
public void go() {
JFrame frame = new JFrame();
button = new JButton("Click Me");
button.addActionListener(this); //向按鈕登記
frame.getContentPane().add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}

//實作 ActionListener 中定義的 method,用來處理事件用
//按鈕會以 ActionEvent object 作為 argument 來呼叫此 method
public void actionPerformed(ActionEvent e) {
button.setText("I've been clicked!!");
}
}

6、Listener、來源、與事件
  • 程式設計師的工作是要實作出 Listener interface 並向按鈕登記
  • 身為事件來源的按鈕,必須接受登記、取得使用者的事件,並在使用者採取動作時呼叫 Listener 的事件處理 method
  • 當呼叫 Listener interface 上的 method 時,帶有事件資訊的 Event object 會被當作 argument 傳入

7、在 GUI 上加東西的方法有三種
  • 在 frame 上放置 widget(在 javax.swing package 中有很多 widget 可用)
  • 在 widget 上繪製 2D 圖形(使用 graphic 物件來繪製圖形)
  • 在 widget 上繪製 JPEG 圖

8、paintComponent(Graphics g) {} 中的 g,其實是個 Graphics2D object
由於 g 是個 Graphics2D 的物件,因此可以將其轉換回來,以使用更多 Graphics2D class 所提供的功能

9、當有多個 widget 會觸發事件,就必須要有多個 Listener 進行處理,此時使用 Inner class 是很好的解決之道
因為 inner class 可以自由存取 outer class 的內容,即使定義為 private 也是沒有問題

10、inner class 的時體一定會綁在 outer class 的實體上
任何 inner class 都僅能存取它所屬的 outer class,無法對其它的 class 進行存取

11、Inner class 提供了在一個 class 中實作「同一個 interface」多次的機會

沒有留言:

張貼留言