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

首頁 > 學院 > 開發設計 > 正文

Java 2 新的焦點子系統

2019-11-18 11:45:13
字體:
來源:轉載
供稿:網友

  最新的 java 標準版,1.4 發行版中,Java 2 平臺有了個全新的 AWT 焦點子系統,我們對此進行了獨家報導。Java 語言工程師 Bertrand Portier 對新的類和方法進行了初步研究(包括基本的 KeyboardFocusManager),這些類和方法中包含該 AWT 焦點子系統。他還提供了遷移到新的 API 時調整編程工作的技巧,一個能工作代碼樣本示例及其它更多內容。請在討論論壇與作者和其它讀者分享您關于本文的想法。
  
  Java 2 標準版,1.4(也稱 Merlin)引入許多人們期待已久并為之雀躍的對 Java 平臺的更改。其中一個就是對 AWT 焦點治理子系統的更改。這個 AWT 焦點子系統的新實現與舊的完全不同。實際上,許多代碼都被完全重新編寫過了,這樣做在某些情況下是以犧牲向下兼容為代價的。我們認為這些措施是必需的,原因在于舊的 AWT 焦點子系統不完善。
  
  
  
  改進了的焦點模型的中心是新的 KeyboardFocusManager 類,它由幾個增加的 Swing 類和 AWT 類支持。本文的絕大部分用于讓我們學習這些更改,并討論它們會如何影響您的 Java 編程工作。在本文的結束部分,我將提供一些技巧和一個親身實踐的示例來幫助您將當前的應用程序和新的 API 相集成。
  
  
  
  請注重,本文假定您了解與 AWT 焦點子系統以前的實現相關的使用和術語。
  
  
  
  KeyboardFocusManager 簡介
  
  KeyboardFocusManager 類用于治理與新的 AWT 焦點子系統的焦點相關的任務。它負責活動的和已定焦的窗口以及當前的焦點所有者。它的任務是讓客戶機代碼可以啟動焦點的更改并調度與焦點相關的所有事件。
  
  
  
  KeyboardFocusManager 給 AWT 焦點子系統帶來許多新功能。其中的一些功能如下:
  
  
  
  用 Shift-Tab 將焦點轉到 tab 組的前一個組件
  
  跟蹤由鼠標引起的焦點遍歷行為。
  
  確定當前的焦點所有者。
  
  KeyboardFocusManager 有四個字段:
  
  
  
  FORWARD_TRAVERSAL_KEYS:通常是 Tab(或 Ctrl-Tab)鍵
  
  BACKWARD_TRAVERSAL_KEYS:通常是 Shift+Tab(或 Ctrl-Shift-Tab)
  
  UP_CYCLE_TRAVERSAL_KEYS:無缺省值
  
  DOWN_CYCLE_TRAVERSAL_KEYS:無缺省值
  
  我們將在下面幾節中討論其中的一些字段。
  
  
  
  KeyboardFocusManager 是個抽象類,我們能夠用它全局的請求焦點信息。例如,KeyboardFocusManager.getFocusOwner() 返回當前的焦點所有者。DefaultKeyboardFocusManager 類對 AWT 應用程序是作為缺省提供的。您當然可以選用自己的 KeyboardFocusManager 類來替代該焦點模型。但是,倘若本機的焦點策略復雜的話,建議您還是建立 KeyboardFocusManager 或 DefaultKeyboardFocusManager 的子類吧。
  
  
  
  AWT 焦點子系統的總體改進
  
  AWT 焦點子系統的前一個發行版因其輕量級的或重量級的組件類型和擁有 Java 虛擬機平臺的不一致行為而受挫。因為重量級的組件實施使用一個獨立的本機窗口(AWT 組件),對于本機焦點系統它們是可信賴的。輕量級的(基于 Swing 的)組件在不同平臺上的外觀和感覺都相同。KeyboardFocusManager 解決了這種不一致,確保了輕量級和重量級組件所有和焦點相關的動作和查詢都成為可能。
  
  
  
  確定當前的焦點所有者和焦點窗口
  
  當前的焦點所有者是新的 AWT 焦點模型中的一個要害元素。所有遍歷操作都從當前的焦點所有者或從另一個被虛擬的認作焦點所有者的組件開始。每個給定時間只能有一個當前的焦點所有者。當前的焦點所有者是個已收到 FOCUS_GAINED 事件 — 但還未收到 FOCUS_LOST 事件的組件(有關這些事件的更多信息,請參閱下面的內容)。
  
  
  
  您使用 KeyboardFocusManager.getFocusOwner() 來確定當前的焦點所有者。假如該焦點所有者未和調用線程處于同一個上下文中,那么該方法會返回空。因此,您應該在代碼中使用 KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()。這樣,只有當焦點被設置成“無組件(no component)”時才會返回空。此外,該 Component 類提供了 isFocusOwner() 方法,假如該組件是焦點所有者,那么這個方法就返回真。
  
  
  
  同樣,擁有焦點的窗口就是包含當前的焦點所有者的窗口。KeyboardFocusManager.getFocusedWindow() 返回的擁有焦點的窗口和調用線程處在相同的上下文中。再說一遍,您應該使用 KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow() 來確保該擁有焦點的窗口和調用線程處在相同的上下文中。
  
  
  
  確定焦點更改中的對立組件
  
  一些窗口和組件的焦點事件含有相應的對立事件。這樣的事件集有:
  
  
  
  FOCUS_LOST 和 FOCUS_GAINED
  
  WINDOW_ACTIVATED 和 WINDOW_DEACTIVATED
  
  WINDOW_LOST_FOCUS 和 WINDOW_GET_FOCUS
  
  當調遣其中的一個事件時,總是同時調遣了這個事件的對立事件。焦點更改的對立組件只是個獲取對立事件的組件。例如,當一個組件獲得了焦點時,其對立組件就是那個失去該焦點的組件。
  
  
  
  FocusEvent.getOppositeComponent() 方法和 WindowEvent.getOppositeWindow() 方法返回焦點更改所涉及的對立組件或窗口。 上面列出的六個焦點事件和這兩個方法密切相關。當一個窗口得到一個 WINDOW_DEACTIVATED 事件時,getOppositeWindow() 方法查找獲取 WINDOW_ACTIVATED 事件的窗口。假如其對立組件或窗口處于一個不同的上下文,這些方法中每一個都會返回空。
  
  
  
  通過編程來實現焦點遍歷
  
  正如 AWT 焦點子系統規范中所定義的,一個焦點遍歷循環是一組被定義過的組件,組中的每個組件(組外沒有組件)會在前序或后序焦點遍歷中被遍歷到。
  
  
  
  焦點遍歷循環中每個組件都有自己的上一個組件和下一個組件。KeyboardFocusManager 類提供了在給定的遍歷循環中傳遞焦點,或者甚至更改焦點遍歷循環的方法。
  
  
  
  focusNextComponent() 在遍歷循環中把焦點傳遞給下一個組件。該方法可以把另一個組件作為它的參數,然后把焦點傳遞給焦點遍歷循環中緊接著的那個組件。 focusPReviousComponent() 對于遍歷循環中前一個組件的處理與之類似。
  
  
  
  Container 一般既起到一個焦點遍歷循環的成員的作用,也起到另一個焦點遍歷循環的根的作用。這讓我們理解了焦點遍歷層次結構的概念,從而明白了向上和向下的焦點循環的概念。 upFocusCycle() 把焦點從當前的焦點所有者向上移動一個焦點遍歷循環。它可以把一個組件作為它的參數,從而把焦點向上移動一個遍歷循環到該組件的遍歷循環。 downFocusCycle() 的處理方法相同,但只在組件是焦點遍歷循環的根的情況下使用。
  
  
  
  在下面的代碼樣本中,您可以看到一個框架包含了兩個組件;調用這兩個組件其中之一的 upFocusCycle() 會使框架獲得焦點。請注重,假如沒有可以定焦的其他組件,焦點所有者就不會改變。
  
  
  
  通過調用 KeyboardFocusManager.clearGlobalFocusOwner(),您可以把焦點所有者設置成“無組件(no component)”。這導致了當前的焦點所有者的 FOCUS_LOST 事件。直到用戶交互或代碼明確地設置了焦點所有權為非凡的組件,才丟棄所有的鍵事件。這不僅對 Java 組件是有效的,對本機級別的組件也有效。
  
  
  
  Componet 類、Container 類和 Windows 類中的新方法
  
  在 Merlin 的 Component 和 Container 類中,已經添加了新的與焦點相關的方法。您可以把他們作為 KeyboardFocusManager 方法的備用方法使用它們,從而設置或獲取這些類的實例的焦點屬性。例如, Component.isFocusable() 傳達了組件是否可以定焦。所有組件缺省的返回值都為真,因為所有組件在缺省情況下都是可定焦的。這不同于前幾個發行版 — 輕量級組件缺省情況下不可定焦。Component.setFocusable(boolean) 設置組件是否可定焦。
  
  
  
  setFocusable(false) 會導致隨后調用 requestFocus() 和 requestFocusInWindow() 的失敗。請注重,Component 類和 Container 類的一些方法和 KeyboardFocusManager 中的一些方法有相同的功能并且是等價的。例如,Component.setFocusTraversalKeys() 可以用來覆蓋一個應用程序中特定組件的遍歷鍵,該應用程序有它自己的策略和由 KeyboardFocusManager.setDefaultFocusTraversalKeys() 定義的焦點遍歷鍵集。
  
  
  
  Window.setFocusableWindow(boolean) 答應您通過程序來防止窗口或它的任何子組件成為焦點所有者。所有窗口在缺省情況下都是可定焦的,但在特定情況下需要把窗口設置成不可定焦。一個明顯的示例是輸入法合成窗口。輸入法用來輸入不能由標準 102 鍵鍵盤完全插入的文本字符。很明顯,您希望焦點遍歷循環不包括輸入法合成窗口(如下所示),因此使用 Window.setFocusableWindow(false)。
  
  
  
  圖 1. Turbolinux 中文輸入法合成窗口的屏幕截圖
  [[The No.2 Picture.]]
  新的遍歷策略類
  
  FocusTraversalPolicy 類定義了組件遍歷的順序。該類應該提供不同的方法分別確定前一個、后一個、第一個、最后一個組件及缺省組件。它負責調遣要害事件、焦點事件和焦點相關的窗口事件。 Java.awt.FocusTraversalPolicy 是所有遍歷策略類的抽象類。它有下列

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 舒城县| 玛曲县| 潼南县| 加查县| 日土县| 天镇县| 尉氏县| 建湖县| 邵阳市| 宁晋县| 满城县| 辽宁省| 宜春市| 凤阳县| 镇雄县| 盐津县| 砀山县| 台南县| 靖西县| 蓝山县| 敦煌市| 古田县| 镇坪县| 巴南区| 吉水县| 宁远县| 洪雅县| 岐山县| 松潘县| 临颍县| 固镇县| 探索| 祁连县| 岚皋县| 马山县| 德惠市| 理塘县| 炎陵县| 平利县| 梁平县| 瑞金市|