首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

重探 Java 1.1 AWT 早期範例:文本、區域、按鈕、選單與對話框全解析

     編輯:Java 相關知識

前言

本文回顧《Thinking in Java》經典範例,展示 Java 1.1 新事件模型如何改寫舊版程式碼,涵蓋 TextField、TextArea、Checkbox/RadioButton、Choice、List、Menu、Dialog、FileDialog 等核心元件,並示範 Applet/Application 雙模式啟動技巧。

1. 文本欄位 — 多重監聽器協作

// TextNew.java 關鍵片段
t1.addTextListener(new T1());      // 文字改變 → 複製到 t2
t1.addActionListener(new T1A());   // Enter 鍵 → t3 顯示動作計數
t1.addKeyListener(new T1K());      // 按鍵攔截 → 強制大寫、自訂 Backspace

關鍵觀察

  • 事件順序:KeyListener 先於 TextListener 觸發,故 T1K 的 e.consume() 能阻止原字元輸入,實現強制大寫。
  • KeyAdapter 避免實作所有介面方法,只覆寫 keyTyped()。
  • 內部類自動捕獲外部類欄位(t1, t2, t3),無需額外傳參,解決「回調」問題。

2. 文本區域 — 滾動條控制

Java 1.1 新增建構子參數控制捲軸:

new TextArea("t3", 1, 30, TextArea.SCROLLBARS_NONE);
new TextArea("t4", 10, 10, TextArea.SCROLLBARS_VERTICAL_ONLY);
new TextArea("t5", 4, 30, TextArea.SCROLLBARS_HORIZONTAL_ONLY);
new TextArea("t6", 10, 10, TextArea.SCROLLBARS_BOTH);

注意:捲軸只能在建構時決定,運行期無法切換;即使無捲軸,游標移動仍受限制。

3. 核取方塊與單選按鈕 — 兩種監聽策略

策略一:共用監聽器 + 來源判斷

class ILCheck implements ItemListener {
    public void itemStateChanged(ItemEvent e) {
        for (int i=0; i<cb.length; i++)
            if (e.getSource().equals(cb[i])) { t.setText("Check box "+(i+1)); return; }
    }
}

優點:動態增減核取方塊無需修改監聽器邏輯。

策略二:各自專屬監聽器

class IL4 implements ItemListener { public void itemStateChanged(ItemEvent e) { t.setText("Radio button four"); } }

優點:邏輯簡單、無條件判斷;缺點:類別數量隨元件增加。

建議:邏輯統一用共用監聽器;邏輯差異大用獨立監聽器。

4. 下拉選單 — 動態增項

c.addItemListener(new CL()); // 選擇改變 → 顯示索引與字串
b.addActionListener(new BL()); // 按鈕 → 動態新增項目

已知缺陷:首次下拉前若未加完所有項目,下拉寬度不會自動調整(Java 1.1 行為)。

5. 列表框 — 解決單擊衝突

Java 1.0 List 單擊/雙擊衝突;1.1 直接支援 ItemListener,單選/多選皆自然觸發 itemStateChanged,無需特殊邏輯。

6. 選單 — 事件模型與快捷鍵

  • MenuItem 用 ActionListener,CheckboxMenuItem 用 ItemListener。
  • setActionCommand() 解決國際化問題:程式碼檢查命令字串而非標籤文字,修改語言無需改邏輯。
  • MenuShortcut(KeyEvent.VK_E) 為「離開」設定 Ctrl+E 快捷鍵。
  • 選單列可動態切換:setMenuBar(mb2)。
  • 程式化產生 WINDOW_CLOSING 事件關閉視窗:dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING))。

7. 對話框 — 內部類巢狀與井字遊戲

ToeDialog 包含 ToeButton (extends Canvas),四層內部類巢狀。ToeButton 持有父對話框參考存取 turn 狀態。MouseAdapter 簡化滑鼠事件處理。

靜態成員不可置於內部類;非靜態內部類隱含外部實例參考,影響序列化與重用,權衡複雜度與封裝性。

8. 檔案對話框 — 開啟/儲存模式

// 開啟模式 (預設)
FileDialog d = new FileDialog(this, "Open?", FileDialog.LOAD);
d.setFile("*.java"); d.setDirectory("."); d.show();

// 儲存模式
FileDialog d = new FileDialog(this, "Save?", FileDialog.SAVE);

getFile() 回傳 null 表示使用者取消。

Applet/Application 雙模式啟動範本

public static void main(String[] args) {
    MyApplet applet = new MyApplet();
    Frame f = new Frame("Title");
    f.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) { System.exit(0); }
    });
    f.add(applet, BorderLayout.CENTER);
    f.setSize(300,200);
    applet.init(); applet.start();
    f.setVisible(true); // Java 1.1 取代 show()
}

內部類 WL extends WindowAdapter 可進一步簡化為匿名類別。

JAR 封裝加速 Applet 載入

jar cf MyApplet.jar *.class
<applet code="MyApplet.class" archive="MyApplet.jar" width=200 height=150></applet>

壓縮傳輸、單一請求、避免類別碎片化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved