国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

事件監(jiān)聽器:將JavaBeans接通起來的方法

2019-11-18 11:31:56
字體:
供稿:網(wǎng)友

  通 過 適 當(dāng) 配 置,javaBeans 能 夠 去" 監(jiān) 聽" 其 它 軟 件 對(duì) 象。 而 且 正 如 你 將 要 看 到 的 一 樣, 一 個(gè)Java1。1 類( 包 括 任 何 一 個(gè)JavaBeans) 一 旦 成 為 一 個(gè) 事 件 監(jiān) 聽 者, 就 不 僅 僅 只 能 夠 監(jiān) 聽 其 父 類, 而 且 能 夠 監(jiān) 聽 所 有 產(chǎn) 生 事 件 的 類。 事 件 監(jiān) 聽 者 的 思 想 正 是Java 類( 和 其 它JavaBeans) 如 何 處 理 事 件 的 關(guān) 鍵。
  
  我 先 來 介 紹 兩 個(gè) 圖 標(biāo), 它 們 將 幫 助 我 們 識(shí) 別 一 些 關(guān) 鍵 問 題。
  
  JavaBeans 是 一 個(gè) 重 要 概 念
  Cuppajoe 圖 標(biāo) 表 示 對(duì) 于Java 語 言 來 說 新 的 或 重 要 的 思 想
  
  什 么 是 事 件
  軟 件 事 件 是 一 段 說 明 某 事 已 經(jīng) 發(fā) 生 的 數(shù) 據(jù)。 用 戶 移 動(dòng) 鼠 標(biāo), 或 從 網(wǎng) 上 傳 來 數(shù) 據(jù) 報(bào), 或 傳 感 器 監(jiān) 測(cè) 到 某 人 非 正 常 介 入, 所 有 這 些 發(fā) 生 的 情 況, 都 可 以 被 看 成 是 事 件 的 實(shí) 例, 而 有 關(guān) 這 些 情 況 的 信 息 可 以 包 括 在 事 件 之 中。 通 常 情 況 下, 根 據(jù) 事 件 處 理 來 開 發(fā) 軟 件 系 統(tǒng) 是 較 為 方 便 的: 在 此 情 況 下, 程 序 設(shè) 計(jì) 變 成 一 種 對(duì)" 當(dāng) 此 發(fā) 生 時(shí), 做 彼" 式 的 敘 述 進(jìn) 行 加 工 處 理 的 過 程。 如 果 鼠 標(biāo) 已 被 移 動(dòng), 則 隨 之 移 動(dòng) 屏 幕 上 的 光 標(biāo); 如 果 網(wǎng) 上 傳 來 數(shù) 據(jù) 報(bào), 則 讀 之; 如 果 發(fā) 現(xiàn) 有 人 侵 入, 則 驅(qū) 逐 之。
  
  通 常 而 言, 一 個(gè) 事 件 包 括 以 下 信 息: 事 件 源( 產(chǎn) 生 事 件 或 最 初 接 收 到 事 件 的 對(duì) 象), 事 件 的 發(fā) 生 時(shí) 刻, 和 一 些 事 件 接 收 者 可 能 用 到 的 說 明 什 么 情 況 發(fā) 生, 如 何 去 做 的 子 類 的 具 體 信 息。 例 如, 在Windows 系 統(tǒng) 中, 就 應(yīng) 當(dāng) 有 一 個(gè) 關(guān) 于 點(diǎn) 擊 鼠 標(biāo) 的 事 件 子 類。 點(diǎn) 擊 鼠 標(biāo) 事 件 將 包 括 點(diǎn) 擊 鼠 標(biāo) 時(shí) 的 時(shí) 刻; 也 可 能 包 括 當(dāng) 點(diǎn) 擊 發(fā) 生 時(shí), 鼠 標(biāo) 在 屏 幕 上 的 位 置,SHIFT 鍵 和ALT 鍵 的 狀 態(tài), 是 點(diǎn) 擊 了 鼠 標(biāo) 左 鍵 還 是 右 鍵 等 等 諸 如 此 類 的 信 息。 處 理 事 件 的 編 碼, 不 可 思 議 地 被 稱 為" 事 件 處 理 者"(event handler)。
  
  那 么, 所 有 這 些 與JavaBeans 有 何 關(guān) 系 呢? 事 件 是Beans 相 互 通 訊 的 主 要 方 式。 這 點(diǎn) 我 們 在 下 面 將 會(huì) 看 到。 如 果 你 正 確 地 選 擇 了 事 件 和 它 們 的 連 接, 你 就 可 能 在 你 的 應(yīng) 用 系 統(tǒng) 中 將Beans 相 互 接 通, 讓 每 一 個(gè)Beans 按 照 你 的 意 愿 去 響 應(yīng) 與 其 相 關(guān) 的 事 件。 每 一 個(gè)Beans 將 各 負(fù) 其 責(zé), 對(duì) 新 來 的 事 件 進(jìn) 行 適 當(dāng) 地 響 應(yīng), 并 且 當(dāng) 新 的 情 況 出 現(xiàn) 的 時(shí) 候, 向 相 關(guān) 的 鄰 居Beans 發(fā) 送 新 的 事 件。 一 旦 你 知 道 如 何 利 用 事 件, 你 就 能 夠 寫 出 通 過 事 件 和 其 他 組 件 進(jìn) 行 通 訊 的Beans。 更 進(jìn) 一 步 地 講, 外 部 系 統(tǒng), 例 如 集 成 開 發(fā) 環(huán) 境(IDEs) 能 夠 自 動(dòng) 地 檢 測(cè) 你 的Beans 所 用 的 事 件, 并 能 讓 你 以 圖 解 的 方 式 來 互 連Beans。IDEs 同 樣 也 能 向JavaBeans 發(fā) 送 事 件 和 從JavaBeans 接 收 事 件, 本 質(zhì) 上 講, 可 以 從 外 部 來 控 制JavaBeans。
  
  為 了 了 解 事 件 怎 樣 和Beans 一 起 工 作, 你 就 必 須 了 解 他 們 在Java 中 是 如 何 工 作 的。 而 事 件 工 作 的 方 式 各 不 相 同,JDK1。1 則 是 標(biāo) 準(zhǔn) 的。
  
  JDK 1。0 的 事 件 機(jī) 制 有 何 問 題?
  在JDK1。0 中, 事 件 主 要 被 用 在 抽 象 視 窗 工 具 包(AWT) 中, 當(dāng) 在 用 戶 接 口 上 出 現(xiàn) 某 種 情 況 時(shí), 它 將 通 知 相 應(yīng) 的 類。 程 序 員 應(yīng) 用 繼 承 機(jī) 制, 通 過 創(chuàng) 建 某 個(gè) 類 的 能 夠 接 收 相 應(yīng) 的 事 件 類 型 的 子 類 對(duì) 象 和 重 載 父 類 的 事 件 處 理 過 程, 來 進(jìn) 行 事 件 處 理。
  
  例 如, 在Java1.0 版 中, 能 夠 獲 得 某 個(gè) 行 為 事 件(action event) 的 唯 一 途 徑, 就 是 把 它 從 某 個(gè) 知 道 如 何 處 理 此 行 為 事 件 的 類 中 繼 承 下 來。
  
  public class MyButton extends java.awt.Button
  {
  //重載action()方法以處理行為事件
  public boolean action(Event evt, Object what)
  {
  //此處,做一些行為事件所做的事
  }
  }
  
  這 意 味 著, 只 有 從java。awt。button 中 繼 承 下 來 的 類 才 能 夠 響 應(yīng) 點(diǎn) 擊 鼠 標(biāo) 事 件。 這 種 組 織 結(jié) 構(gòu) 與 用 戶 接 口 捆 綁 在 一 起, 不 夠 靈 活 方 便。 它 不 便 于 構(gòu) 造 新 的 事 件 類 型。 而 且 即 便 你 能 夠 構(gòu) 造 新 的 事 件, 你 也 很 難 改 變 那 些 將 被 類 響 應(yīng) 的 事 件, 因 為 有 關(guān) 的 信 息 都 被 僵 硬 地 固 化 在AWT 的" 族 系 樹"( 繼 承 圖) 中。
  
  新 的JDK1。1 擁 有 一 個(gè) 更 為 普 適 的 事 件 框 架, 它 能 夠 讓 產(chǎn) 生 事 件 的 類 和 其 它 不 產(chǎn) 生 事 件 的 類 互 相 通 訊。 新 的 模 式 放 棄 了 定 義 客 戶 子 類 必 須 重 載 的 事 件 處 理 函 數(shù)( 方 法) 的 工 作 方 式, 轉(zhuǎn) 而 采 用 定 義 接 口 的 方 式。 如 果 一 個(gè) 類 需 要 接 收 某 一 特 定 的 消 息 類 型, 則 這 個(gè) 類 可 以 使 用 所 定 義 的 接 口。( 你 可 能 會(huì) 明 白, 這 意 味 著 通 過" 授 權(quán)"(delegation), 而 不 是 通 過" 繼 承"(inheritance) 來 處 理 事 件)。 我 們 將 還 以JDK1。0 button 例 子 來 說 明JDK1。1 的 模 式。
  
  我 在 此 想 要 做 的 事 是, 構(gòu) 造 一 個(gè) 新 的 類, 使 它 能 夠 在 按 鈕 被 按 下 時(shí), 去 做 某 件 事 情。 在JDK1。0 版 中, 為 了 處 理 與 按 鈕(Button) 行 為 相 關(guān) 的 事 件, 我 必 須 繼 承java。awt。Button, 這 樣, 一 旦 某 個(gè) 按 鈕 被 按 下 時(shí), 該 按 鈕 將 會(huì) 讓 我 的 新 類 知 道。
  
  //...在程序的另一個(gè)地方,我們定義了"監(jiān)聽"按鈕行為的對(duì)象
  ActionListener myActionListener = new ActionListener();
  //...
  
  //按鈕行為事件
  public class MyButton extends java.awt.Button
  {
  //重載action()以通知我的新類
  public boolean action(Event evt, Object object)
  {
  myActionListener.action(evt, object);
  }
  }
  
  現(xiàn) 在, 每 當(dāng)MyButton 被 按 下 時(shí),myActionListener 對(duì) 象 都 會(huì) 收 到 一 個(gè) 事 件。myActionListener 并 非 一 定 要 是java。awt。Component 的 一 個(gè) 子 類, 但 它 的 確 要 包 括 一 個(gè)action() 方 法。 我 們 把 這 個(gè) 新 類 稱 為ActionListener, 是 因 為 這 個(gè) 新 類 一 直 將 要" 監(jiān) 聽" 它 所 依 附 的Botton 的 行 為 事 件。 在 此, 仍 有 一 些 問 題 存 在:
  
  當(dāng) 按 下 此 按 鈕 時(shí), 將 要 通 知 的 對(duì) 象 是 固 定 在 程 序 中 的, 這 就 是 說, 我 不 能 在 程 序 運(yùn) 行 時(shí) 刻(runtime)" 重 新 接 通"Button 和myActionListener 的 關(guān) 系。
  
  僅 有 一 個(gè) 對(duì) 象 可 被 通 知 到; 如 果 其 它 幾 個(gè) 對(duì) 象 都 與 點(diǎn) 擊Button 有 關(guān) 系, 這 該 如 何 解 決?
  
  我 們 仍 然 沒 有 解 決 通 過" 繼 承" 來 接 收 按 鈕 行 為 事 件 的 難 題-- 這 就 是 說,myActionListener 仍 必 須 從 某 個(gè)" 了 解" 按 鈕 及 其 行 為 事 件 的 類 中 繼 承 下 來。
  對(duì) 第 一 個(gè) 問 題, 有 一 個(gè) 可 供 選 擇 的 辦 法 是 在MyBotton 類 中 增 加setListener(ActionListener newListener) 及myNewClass getListener() 兩 個(gè) 方 法, 和 一 種 能 更 換 被 通 知 的 對(duì) 象 的 途 徑。 然 而 非 常 不 幸, 我 們 仍 然 不 能 僅 僅 局 限 于 為 每 一 個(gè) 按 鈕 關(guān) 連 一 個(gè) 對(duì) 象, 因 而 下 面 你 將 看 到, 我 們 將 生 成 一 系 列 的 監(jiān) 聽 器(listeners)。
  
  //按鈕行為事件( button action event)
  public class MyButton extends java.awt.Button
  {
  PRivate Vector listeningObjects = new Vector();
  
  //重載action()以通知我的新類
  public boolean action(Event evt, Object object)
  {
  for (int i = 0; i
  
  好 了 , 現(xiàn) 可 以 看 到 , 任 何 一 個(gè)ActionListener 的 實(shí) 例 都 可 以 通 過 調(diào) 用addActionListener(this)" 監(jiān) 聽" 任 何 一 個(gè)Mybutton 實(shí) 例 上 的 事 件 , 并 且 通 過 調(diào) 用removeActionListener(this) 結(jié) 束" 監(jiān) 聽"。 這 一 進(jìn) 步 的 確 不 錯(cuò) , 但 是 有 關(guān)" 繼 承" 的 問 題 仍 然 困 繞 著 我 們: 只 有Button 和ActionListener 對(duì) 象( 及 其 派 生 類 對(duì) 象) 才 能 接 收 到Button 行 為 事 件。 對(duì) 此 ,Java 有 著 新 的 解 決 路 線: 接 口。
  
  接 口 和 事 件 監(jiān) 聽 器
  在Java 術(shù) 語 表(http://Java。sun。com/docs/glossary。Html) 中 將 接 口 定 義 如 下:
  
  接 口(interface): 在Java 中 , 是 一 組 特 定 的 方 法 , 這 些 方 法 可 以 在 多 個(gè) 不 同 的 類 中 實(shí) 現(xiàn) , 而 不 必 考 慮 這 些 類 在 類 系 結(jié) 構(gòu) 中 的 等 級(jí) 關(guān) 系。
  
  為 什 么 它 會(huì) 如 此 有 用?
  接 口 定 度 了 一 “角 色”,通 過 實(shí) 現(xiàn) 這 一 接 口 中 的 一 系 列 操 作 , 每 一 個(gè) 類 都 可 以 扮 演 接 口 的 角 色 。
  
  接 口 的 定 義 和 類 的 定 義 看 起 十 分 相 似:
  
  // 仍 在JDK1.0 內(nèi)
  public interface ActionListener
  {
  void action(Event evt, Object obj

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兰坪| 佛教| 乌鲁木齐市| 靖西县| 饶平县| 闸北区| 淮北市| 商南县| 都兰县| 连云港市| 桂阳县| 阿拉善右旗| 纳雍县| 凉城县| 德安县| 肥东县| 成安县| 中西区| 嘉义县| 杭锦后旗| 章丘市| 邢台市| 绿春县| 襄城县| 宝应县| 兴化市| 沐川县| 云梦县| 萝北县| 会同县| 东明县| 陇川县| 蓬莱市| 墨脱县| 阿克陶县| 信宜市| 呈贡县| 武汉市| 陆丰市| 平陆县| 化德县|