整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaFX 11發行說明

          以下記錄描述了有關此版本的重要更改和信息。在某些情況下,該說明提供了有關問題或更改的其他詳細信息的鏈接。

          從JDK 11開始,JavaFX模塊與JDK分開提供。這些發行說明涵蓋了獨立的JavaFX 11發行版。JavaFX 11需要JDK 10(必須是OpenJDK版本)或JDK 11.建議使用JDK 11。

          重要變化

          運行JavaFX應用程序

          既然JDK不再包含JavaFX,則必須明確包含應用程序使用的JavaFX模塊。有關說明,請參閱JavaFX 11入門頁面。

          添加API以自定義Spinner控件的步驟重復計時

          在JavaFX 11中修改值步驟之前,必須在Spinner控件箭頭按鈕上按下鼠標的默認持續時間。已添加兩個新屬性“initialDelay”和“repeatDelay”來配置此行為。

          initialDelay:在下一個值步驟之前必須在箭頭按鈕上按下鼠標的持續時間。默認值現在為300毫秒。

          repeatDelay:在第一個值步驟之后,每個連續步驟必須按下鼠標的持續時間。默認值現在為60毫秒。

          有關更多信息,請參閱JDK-8167096。

          默認情況下,獨立的javafx模塊不再具有權限

          javafx.* 模塊現在由應用程序類加載器加載,默認情況下不再具有權限。想要在啟用安全管理器的情況下運行的應用程序需要使用“-Djava.security.policy”指定自定義策略文件,并為每個 javafx.* 模塊授予所有權限。有關更多信息,請參閱JDK-8210617。

          將默認GTK版本切換為3

          現在,JavaFX將在存在gtk3庫的Linux平臺上使用GTK 3。在JavaFX 11之前,GTK 2庫是默認的。這與JDK 11中AWT的默認值相匹配。有關更多信息,請參閱JDK-8198654。

          新功能

          以下注釋描述了JavaFX 11中的一些增強功能。有關完整列表,請參閱發行說明末尾的表格。

          FX Robot API

          添加了公共FX Robot API以支持模擬用戶交互,例如在鍵盤上鍵入鍵并使用鼠標以及捕獲圖形信息。有關更多信息,請參閱JDK-8090763。

          刪除了功能和選項

          刪除對libavcodec 53和55的支持

          FX Media對libavcodec 53和55的支持已被刪除。默認情況下,這些庫不在受支持的Linux平臺上,并且不再需要。有關更多信息,請參閱JDK-8194062。

          已知的問題

          JavaFX在Ubuntu 18.04上使用Wayland與OpenJDK 11崩潰

          啟用XWayland窗口服務器時,JavaFX在Ubuntu 18.04 Linux機器上崩潰。只要FX窗口工具包代碼在Linux上使用GTK 3,就會發生這種情況,這是JavaFX 11的默認設置。

          建議的解決方法是在運行JavaFX應用程序時使用Xorg服務器而不是Wayland服務器。請注意,JDK 10或JDK 11不支持Wayland。

          另一種解決方法是通過在命令行上傳遞以下系統屬性來顯式強制GTK 2:

           java -Djdk.gtk.version=2 ...
          

          有關更多信息,請參閱JDK-8210411。

          使用JDK 10運行時,Swing interop需要合格的導出

          要使用帶有OpenJDK 10版本的JavaFX 11運行FX / Swing互操作應用程序,必須在java命令行中添加以下四個限定導出。

          --add-exports=java.desktop/java.awt.dnd.peer=javafx.swing
          --add-exports=java.desktop/sun.awt=javafx.swing
          --add-exports=java.desktop/sun.awt.dnd=javafx.swing
          --add-exports=java.desktop/sun.swing=javafx.swing
          

          有關更多信息,請參閱JDK-8210615。

          使用具有獨立SDK的安全管理器運行時,Swing interop失敗

          在啟用安全管理器的情況下運行時,FX / Swing互操作應用程序將失敗。使用JFXPanel或SwingNode的應用程序必須在未啟用安全管理器的情況下運行。有關更多信息,請參閱JDK-8202451。

          使用jlink創建的最小jdk映像時,Swing interop失敗

          使用包含JavaFX 11 jmods包中的javafx.swing模塊的jlink創建的最小Java映像將無法運行FX / Swing互操作應用程序。例如,如下創建的圖像將不起作用:

           jlink --output myjdk --module-path javafx-jmods-11 \
           --add-modules java.desktop,javafx.swing,javafx.controls
          

          javafx.swing模塊依賴于JDK 11中新的jdk.unsupported.desktop模塊,必須通過該--bind-services選項顯式添加或包含該模塊。

          解決方法:使用以下兩種方法之一創建映像:

           jlink --output myjdk --module-path javafx-jmods-11 \
           --add-modules java.desktop,javafx.swing,javafx.controls,jdk.unsupported.desktop
           jlink --output myjdk --bind-services --module-path javafx-jmods-11 \
           --add-modules java.desktop,javafx.swing,javafx.controls
          

          有關更多信息,請參閱JDK-8210759。

          固定錯誤列表

          發行密鑰概要子組件JDK-8203345啟用屏幕閱讀器時VirtualFlow中的內存泄漏無障礙JDK-8204336當嵌套事件循環處于活動狀態時,Platform.exit()會拋出ISE應用程序生命周期JDK-8089454[HTMLEditor]選擇刪除CENTER對齊控制JDK-8154039選擇TabPane :: getTabs()中未包含的選項卡時內存泄漏控制JDK-8157690[TabPane]排序選項卡使選項卡選擇菜單為空控制JDK-8165459HTMLEditor:意外禁用剪貼板工具欄按鈕控制JDK-8185854具有自定義外觀的TabPane中不可編輯的ComboBox上的NPE控制JDK-8187432ListView:啟動時EditEvent的索引不正確控制JDK-8192800表自動調整大小會忽略列調整大小策略控制JDK-8193311[Spin??ner]在ENTER上未激活默認按鈕控制JDK-8193495快速刪除和添加操作后,TabPane不會正確更新標題區域中的選項卡位置控制JDK-8194913如果將窗格添加到工具欄,則會破壞焦點遍歷控制JDK-8196827test.javafx.scene.control.ComboBoxTest - 生成NullPointerException控制JDK-8197846ComboBox:刪除并重新添加后變為無法點擊控制JDK-8197985在ListView中按Shift + DOWN會導致拋出異??刂艼DK-8200285TabDragPolicy.REORDER阻止顯示ContextMenu控制JDK-8201285重復使用具有disable = true的DateCell時,DateCell文本顏色未正確更新控制JDK-8208610在FXMLLoader :: getDefaultClassLoader中調用類的錯誤檢查FXMLJDK-8129582在Linux上顯示RTL語言文本時,控件顯著減慢圖像JDK-8195801用MarlinFX中的sun.misc.Unsafe替換jdk.internal.misc.Unsafe圖像JDK-8195802消除在javafx.graphics中使用jdk.internal.misc安全實用程序圖像JDK-8195806消除javafx.graphics中對sun.font.lookup的依賴圖像JDK-8195808消除javafx.graphics中對sun.print的依賴圖像JDK-8196617在某些環境中,FX打印測試因NPE而失敗圖像JDK-8198354[macOS]單詞包裝標簽中顯示的損壞的泰語字符圖像JDK-8201231WindowStage.setPlatformEnabled中的java.lang.NullPointerException圖像JDK-8202396ios native imageloader中的內存泄漏圖像JDK-8202743虛線描邊隨機涂錯,可凍結應用圖像JDK-8203378如果FX是使用OpenJDK構建的,則JDK構建無法編譯javafx.graphics module-info.java圖像JDK-8203801PrismLoaderGlue.stg文件中缺少Classpath異常圖像JDK-8207328javafx.css.Stylesheet的API文檔不準確/錯誤圖像JDK-8209191[macOS]扭曲的復雜文本渲染圖像JDK-8088722GSTPlatform無法播放具有多個音軌的MP4文件媒體JDK-8191446[Linux]為openjfx構建構建并提供libav媒體存根媒體JDK-8193313MediaPlayer泄漏本機內存媒體JDK-8195803消除在javafx.media中使用sun.nio.ch.DirectBuffer媒體JDK-8198316在macOS High Sierra 10.13.2上播放m3u8文件時,MediaPlayer崩潰媒體JDK-8199008[macOS,Linux]實例化MediaPlayer導致CPU使用率超過100%媒體JDK-8199527將GStreamer升級到1.14媒體JDK-8202393App Transport Security使用新的編譯器使用JDK構建阻止macOS上的http媒體媒體JDK-8191661Win32 HiDPI上的FXCanvas產生錯誤的結果其他JDK-8193910cssref.html和introduction_to_fxml.html中的版本號是錯誤的其他JDK-8195799在javafx模塊中使用系統記錄器而不是平臺記錄器其他JDK-8195800消除對javafx模塊中sun.reflect.misc的依賴其他JDK-8195974將javafx中的java.util.logging替換為System logger其他JDK-8196297刪除過時的JFR記錄器代碼其他JDK-8199357從FX刪除對applet和Java Web Start的引用其他JDK-8200587修復FX API文檔中的錯誤其他JDK-8202036更新OpenJFX許可證文件以匹配OpenJDK其他JDK-8202357ModuleHelper.java中版權標頭中的額外字符其他JDK-8204653修復FX API文檔中的錯誤其他JDK-8204956修復JDK-8200285后清理空白其他JDK-8207794FXCanvas被重新定義時,FXCanvas不會更新EmbeddedStageInterface的x / y其他JDK-8208294使用jrt協議時,安裝本機庫失敗其他JDK-8180151JavaFX錯誤地使用具有特定尺寸的兩個3D框渲染場景圖場景圖JDK-8192056從組或容器中刪除javafx.scene.shape.Sphere-objects時發生內存泄漏場景圖JDK-8205008GeneralTransform3D轉換函數與單個Vec3d參數錯誤結果場景圖JDK-8207377使用HiDPI記錄Robot :: getPixelColor的行為場景圖JDK-8201291單擊具有setFocusable(false)的JFXPanel會導致其processMouseEvent方法永遠循環swingJDK-8088769HtmlEditor中未顯示透明色的AlphachannelwebJDK-8088925非透明背景導致NumberFormatExceptionwebJDK-8089375當WebWorker文件無法訪問時,腳本應該以靜默方式失敗或發布有意義的異常webJDK-8147476使用MathML標記元素渲染問題webJDK-8193368[OS X]刪除冗余文件webJDK-8193590將WebView與Tooltip一起使用時內存泄漏webJDK-8194265使用FileReader讀取文件時,Webengine(webkit)崩潰webJDK-8194935Cherry挑選GTK WebKit 2.18.5的變化webJDK-8195804從java.base刪除未使用的合格sun.net.www導出到javafx.webwebJDK-8196011從JFXPanel應用程序使用WebView時發生間歇性崩潰webJDK-8196374windows x86 webview-icu isAlphaNumericString崩潰webJDK-8196677Cherry挑選GTK WebKit 2.18.6的變化webJDK-8196968在JNIEnv _ :: CallObjectMethod退出時出現一次崩潰webJDK-8197987將libxslt更新為1.1.32版webJDK-8199474更新到WebKit的606.1版本webJDK-8200418“webPage.executeCommand(”“removeFormat”“,null)刪除了body元素的樣式”webJDK-8200629將SQLite更新到版本3.23.0webJDK-8202277由于依賴于javafx.swing,WebView圖像捕獲因獨立FX而失敗webJDK-8203698訪問某些網站時,JavaFX WebView崩潰webJDK-8204856在PAGE_REPLACED事件之后,WebEngine文檔變為空webJDK-8206899運行'dom / html / level2 / html / AppletsCollection.html'時,DRT會隨機崩潰webJDK-8206995刪除未使用的WebKit文件webJDK-8208114在Webview中打破了文本內容和URL鏈接功能的拖放webJDK-8208622使用html表單控件調用print API時出現[WebView] IllegalStateExceptionwebJDK-8209049Cherry挑選GTK WebKit 2.20.4更改webJDK-8163795[Windows]在本機GetScreenCapture方法中刪除對StretchBlt的調用窗口的工具包JDK-8191885[MacOS] JavaFX主窗口無法在MacOS中從全屏模式返回窗口的工具包JDK-8196031FX Robot mouseMove在Windows 10 1709上使用HiDPI失敗窗口的工具包JDK-8199614[macos] ImageCursor.getBestSize()拋出NullPointerException窗口的工具包JDK-8204635[Linux] getMouseX,gtk中的getMouseY GlassRobot.cpp忽略了HiDPI規模窗口的工具包JDK-8207372Robot.mouseWheel在Linux,Mac上沒有正確實現窗口的工具包增強列表

          發行密鑰概要子組件JDK-8205919創建工件和功能以將其上載到Maven Central構建JDK-8167096添加API以自定義Spinner控件的步驟重復計時控制JDK-8177380在ColorPicker調色板中添加標準顏色控制JDK-8186187修改公共API的返回類型StyleConverter.getEnumConverter()控制JDK-8204621將MarlinFX升級到0.9.2圖像JDK-8090763FX Robot API場景圖JDK-8130379使用getCenter方法增強Bounds類場景圖JDK-8195811使用公共API支持FX Swing互操作swingJDK-8198654將FX的默認GTK版本切換為3窗口的工具包

          記得智趣狗上周為大家帶來的Parrot Mambo嗎?這款能開炮,還能幫你送情書的微型無人機樂趣多多。今天,智趣狗將為大家帶來Mambo的“同宗兄弟”,同樣是Parrot旗下的Swing,業界首款固定X翼的微型無人機。

          小編第一眼看到Parrot Swing時的第一感覺就是:這貨好大!沒錯,在Parrot旗下的微型無人機家族中,Swing的體型絕對算得上是巨無霸級別。但是,相對龐大的機身并沒有影響Swing鷹擊長空的本領,反而帶來了有別于傳統微型無人機的玩法和更強大的性能。

          相信你已經迫不及待了吧?那就一起看看怎么和Parrot Swing一起玩耍吧。

          Flypad手柄讓操作更帶感

          Parrot Swing在國內又稱速影無人機,而且是以“套餐”的形式發售,948元的價格可以得到Parrot Swing主機和Parrot Flypad手柄。

          關于Parrot Flypad手柄我們在Parrot Mambo體驗報告中就已經有所介紹,它最大的意義就是將通過手機APP點觸屏幕的操作改為了物理搖桿和按鈕,“駕駛”起來更帶感。

          同時,通過Parrot Flypad控制Swing飛行,有效控制距離可以從手機操作的20米提升到60米,這意味著你可以讓Swing飛得更遠更高,而不必擔心超出遙控距離。

          Parrot Flypad和時下智能手機的游戲手柄類似,它內置的鋰電池可提供6小時的持續使用時間,通過常見的MicroUSB接口5V充電器就能為其充電,2小時左右即可充滿。

          手柄自帶固定手機的支架,將支架固定在手柄的中凹部分,再利用可伸縮的支架固定好手機即可。打開手機藍牙和FreeFlight Mini APP,然后按照界面提示就能輕松配對使用。

          借助APP,可以讓Swing直接在空中進行各種高速特技飛行。比如右轉、左轉、U形轉、側翻、回旋。咱們無需懂得原理,反正只要你下達了指令,Swing就能完美貫徹執行,這就足夠了。

          Parrot Swing為何這么大

          為了實現固定翼垂直起降的能力,Parrot Swing一改傳統微型無人機的設計風格,在無人機裝上了四片由聚丙烯泡沫塑料打造的“翅膀”,并以“X”型固定。

          這四片X翼,就是讓Parrot Swing看起來超大的“罪魁禍首”。不過,別看Parrot Swing看著體型唬人,其實它的重量依舊十分輕盈,73g(沒錯,算上無人機和X翼的總重量)并沒有和傳統微型無人機拉開太大差距。和智趣狗上周體驗的Parrot Mambo相比僅重了10g。

          Parrot Swing將四個螺旋槳固定在了X翼的頂端,同時還帶有一定向內的傾角,更符合空氣動力學原理。

          Swing無人機主體正面依舊有著兩顆“大眼睛”,內藏LED燈,可以通過不同顏色反映各種使用狀態。

          Swing無人機頂部只有固定螺絲,和黑白相間的配色設計,看起來很醒目。

          無人機底部配有獨立的電源開關。

          Swing的“屁股”上則配備了1顆30萬像素的攝像頭、超聲波傳感器以及Micro USB充電接口,電池倉也設計在了這里。

          熟悉的550mAh電池,和Parrot旗下的其他微型無人機通用,建議大家可以多配幾塊換著使用。

          不要小看Swing迷你的機身(主機部分)哦,它里面集成著一個三軸加速計和一個三軸陀螺儀用以測定Swing的每一個飛行動作或傾斜角度,而獨立的壓力傳感器則用于控制無人機的飛行高度。在四旋翼模式下,Swing的攝像頭每16毫秒將地面圖像與之前圖像進行對比以確定Swing的飛行速度,而超聲波傳感器還能為Swing分析高達4米的飛行高度哦。

          獨特的飛行樂趣

          Parrot Swing的起飛過程和傳統無人機類似,都是借助四個螺旋槳旋轉使其垂直升空。但是,在懸浮半空之后,這款無人機則帶來了更多的玩法。

          比如,你可以讓Swing依舊保持垂直狀態飛行,這個模式沒啥可說的。

          獨特的X翼設計可以讓Swing輕松從垂直進入水平飛行狀態,這才是這款無人機的殺手級功能。在水平飛行模式下可將螺旋槳提供的動力發揮到極致,X翼本身也能產生一定的滑行力,對Swing飛行的總動力有所增益(蚊子再小也是肉)。

          根據資料,Swing在水平飛行模式下要比垂直模式能多出1分鐘的續航時間,從7分鐘延長到了8分鐘,由此不難體現無人機從多軸向水平飛行轉換的潛力所在。

          如果你想看Swing的實際飛行視頻,可以看看下面三段哦

          小編實際飛行拍攝:https://v.qq.com/x/page/e0353bu98ue.html

          官方宣傳視頻:https://v.qq.com/x/page/r0325y4g31h.html

          Swing操作教程:https://v.qq.com/x/page/m033641qt1l.html

          需要注意的是,Swing在水平飛行模式的速度要明顯快于垂直飛行,所以它更適合在空曠的室外環境下試飛。還有一點需要注意,就是碩大的X翼結構讓Swing對環境和風力有著較高的要求,如果試飛周邊有樹木,要小心X翼卡在樹枝上;如果風力較大,Swing在懸停時會讓你感受到《一起搖擺》這首歌的真諦。

          雖然Swing鷹擊長空時對環境要求更高,但這并不影響Swing獨特的飛行樂趣。希望Parrot今后可以多多挖掘X翼結構的飛行潛力,畢竟微型無人機傳統的垂直飛行已經非常成熟了,唯有改變形態和結構,才能讓微型無人機重啟我們體內的荷爾蒙。

          在上一章中,主要介紹了如何使用Java中的事件模型。通過學習讀者已經初步知道了構造圖形用戶界面的基本方法。本章將主要介紹構造功能齊全的圖形用戶界面所需要的一些重要工具。

          下面,首先概述一下Swing的基本體系結構。為了理解怎樣高效地使用一些更高級的組件,必須了解“底層”的東西。然后,再講述Swing中各種常用的用戶界面組件的使用,如文本域、單選按鈕以及菜單等等。接下來,介紹在不用考慮特定的用戶界面觀感(look and feel)的情況下,如何使用Java中的布局管理器特性在一個窗口中排列這些組件。最后,介紹如何在Swing中實現對話框。

          本章覆蓋了基本的Swing組件,如文本組件、按鈕和滑塊等,這些都是使用十分頻繁的重要用戶界面組件。Swing中的高級組件將在卷II中討論。如果要詳細深入地理解Swing框架,推薦參考Kim Topley的《Core JFC》和《Core SwingAdvanced Topics》(Prentice Hall PTR出版社出版)。

          模型-視圖-控制器設計模式

          前面講過,本章將從Swing組件的體系結構開始。在解釋本節標題的含義之前,先看一下構成用戶界面組件(如按鈕、復選框、文本域或者復雜的樹形控件等)的各個部分。每個組件都有三個要素:

          ? 內容,如按鈕的狀態(是否按下),或者文本域的文本。

          ? 外觀(顏色,大小等等)。

          ? 行為(對事件的反應)。

          這三個要素之間的關系是相當復雜的,即使最簡單的組件(如按鈕)也是如此。很明顯,按鈕的外觀顯示取決于觀感。Metal按鈕的外觀不同于Windows按鈕或者Motif按鈕。另外,外觀顯示還要取決于按鈕的狀態:當按鈕被按下時,按鈕需要被重新繪制成另一種不同的外觀。而狀態取決于按鈕接收到的事件。當用戶用鼠標在按鈕上點擊時,按鈕就被按下。

          當然,在程序中使用按鈕的時候,只需把它看成是一個按鈕,而不需要去考慮它的內部操作和特性。畢竟,這些是實現按鈕的程序員的工作。但是,實現按鈕的程序員就要對這些按鈕考慮得細一些了。畢竟,無論觀感如何,他們必須實現這些按鈕和其他用戶界面組件,以便讓這些組件正常地工作。

          為了實現這樣的需求,Swing設計者采用了一種著名的設計模式(design pattern):模型-視圖-控制器(model-view-controller)模式。該設計模式同其他許多設計模式一樣,都遵循第5章中介紹的面向對象設計中的一個基本原則:限制一個對象擁有的功能數量。不要用一個按鈕類完成所有的事情,而是應該讓一個對象負責組件的觀感,另一個對象負責存儲內容。模型-視圖-控制器(MVC)設計模式將告訴我們如何實現這種設計,實現三個獨立的類:

          ? 模型(model):存儲內容。

          ? 視圖(view):顯示內容。

          ? 控制器(controller):處理用戶輸入。

          這個模式明確地規定了三個對象如何進行交互。模型存儲內容,它沒有用戶界面。按鈕的內容非常簡單,只有幾個用來表示當前按鈕是否按下,是否處于活動狀態的圖標等。文本域內容稍稍復雜一些。它是容納當前文本的字符串對象,與視圖顯示的內容并不一致—如果內容的長度大于文本域的顯示長度,用戶只能看到顯示出來的那一部分,如圖9-1所示。

          模型必須實現改變內容和查找內容的方法。例如,一個文本模型中的方法有:在當前文本中添加或者刪除字符以及把當前文本作為一個字符串返回等。記住:模型是完全不可見的。顯示存儲在模型中的數據是視圖的工作。

          注意:“模型”這個術語可能不太貼切,因為人們通常把模型視為一個抽象概念的具體表示。汽車和飛機的設計者構造模型來模擬真實的汽車和飛機。但這種類比可能會使你對模型-視圖-控制器模式產生錯誤的理解。在設計模式中,模型存儲完整的內容,視圖給出了內容的可視化顯示(完整或者不完整)。一個更恰當的類比應當是擺好姿勢給畫家作畫的模特(model)。此時,取決于畫家是如何看模特的,并據此來作一張畫。那張畫是一幅正規的肖像畫,還是一幅印象派作品,還是一幅立體派作品(以古怪的曲線來描畫四肢)完全取決于畫家。

          模型-視圖-控制器模式的一個優點是一個模型可以有多個視圖,其中每個視圖可以顯示全部內容的不同部分或不同方面。例如,一個HTML編輯器常常為同一內容提供兩個同時的視圖:

          一個WYSIWYG(所見即所得)視圖和一個“原始標記”視圖(見圖9-2)。

          當通過某一個視圖的控制器對模型進行更新時,模型會把這種改變通知給兩個視圖。視圖得到通知以后就會自動地刷新。當然,對于一個簡單的用戶界面組件如按鈕來說,不需要為同一模型提供多個視圖。

          控制器負責處理用戶輸入事件,如點擊鼠標和敲擊鍵盤。然后決定是否把這些事件轉化成對模型或視圖的改變。例如,如果用戶在一個文本框中按下了一個字符鍵,控制器調用模型中的“插入字符”命令,然后模型告訴視圖進行更新。而視圖永遠不會知道文本為什么改變了。

          但是如果用戶按下了一個光標鍵,控制器就會通知視圖進行卷屏。卷動視圖對實際文本不會有任何影響,因此模型永遠不會知道該事件的發生。

          設計模式

          在解決一個問題時,不需要從頭做起,而是參考過去的經驗,或者向做過相關工作的專家請教。設計模式是一種方法,該方法以一種結構化的形式展示了專家們的心血。

          近幾年來,軟件工程師們開始對這些模式進行匯總分類。這個領域的先行者的靈感來源于建筑師Christopher Alexander的設計模式。他在《The Timeless Way of Building》(Oxford University Press, 1979)一書中,為公共和私人生活空間的建筑設計模式進行了分類。下面是一個典型的例子:

          窗戶位置

          人人都喜歡靠窗戶的座位,可以畫上凸窗、低窗臺的大窗戶以及放在這里的舒適的椅子。如果一個房間沒有這樣的地方,那么很少有人會感到舒服和安逸。

          如果這個房間沒有一個像這樣“位置”的窗戶,那么房間里的人就可能會面對下面的選擇左右為難:

          1)舒服地坐下。

          2)要充足的光線。

          很明顯,如果舒適的位置—該房間內最想坐的位置—遠離窗戶的話,那么沖突就不可避免。

          因此,對于白天長時間呆的房間,至少要把一個窗戶設計成“窗戶位置”。

          在Alexander的模式分類以及軟件模式的分類中,每個模式都遵循一種特定的格式。模式首先說明使用環境,即產生設計問題的背景。接著解釋問題,通常這里會有幾個沖突的因素。最終,權衡這些沖突,給出問題的解決方案。

          在“窗戶位置”模式中,其使用環境就是白天大部分時間呆著的房間。沖突因素就是想舒服地坐下和充足的光線。而解決方案就是找到一個“窗戶位置”。

          在模型-視圖-控制器模式中,使用環境就是表示信息和接收用戶輸入的用戶界面系統。

          這里有若干沖突因素:對于同一數據來說,可能同時需要更新多個可視化表示,而可視化表示方式可能會改變,例如,適應不同的觀感標準。交互機制也可能改變,例如,支持語音命令等。解決方案是把這些功能分布到三個獨立的交互組件:模型、視圖和控制器。

          當然,模型-視圖-控制器模式要比“窗戶位置”模式復雜得多,它需要詳細地說明如何分布這些功能。

          可以在由Erich Gamma等編寫的《Design PatternsElements of Reusable ObjectOriented Software》(Addisom-Wesley出版社,1995年出版 )一書中找到模型-視圖-控制器模式和其他大量實用的軟件模式的規范描述。這是一本研究模式運動的書籍。

          另外,我們強烈推薦另一本由Frank Buschmann等編寫的《A System of Patterns》,JohnWiley & Sons出版社于1996年出版。這是一本不錯的書,相對上一本來說,這本書更容易讀懂。

          模型-視圖-控制器模式并不是Java設計中所使用的唯一模式。例如,AWT事件處理機制采用了“觀察者”(observer)模式。

          設計模式的另一個重要特點就是它們已經成為文化的一部分。當你談論模型-視圖-控制器模式或者“觀察者”模式時,全世界的程序員都能明白你的意思。因而,模式已經成為探討設計問題的有效方法。

          圖9-4給出了模型、視圖、控制器對象之間的交互。


          程序員使用Swing組件,通常不需要考慮它們的模型-視圖-控制器體系結構。每個用戶界面元素都有一個包裝器類(如JButton或JTextField)來保存模型和視圖。

          當需要查詢內容(如文本域中的文本)時,包裝器類會向模型詢問并且返回所要的結果。當想改變視圖時(例如,在一個文本域中移動光標位置),包裝器類會把此請求轉發給視圖。然而,有時候包裝器轉發命令并不賣力。在這種情況下,就不得不直接同模型打交道。(不必直接操作視圖—這是觀感代碼的工作。)

          模型-視圖-控制器模式吸引Swing設計者的一個重要原因是該模式允許他們實現可插觀感。每個按鈕或者文本域的模型是獨立于觀感的。當然可視化表示是完全依賴于特殊觀感的用戶界面設計的,且控制器也能改變它。例如,在一個語音控制設備中,控制器需要處理的各種事件與使用鍵盤和鼠標的標準計算機完全不同。通過把底層模型與用戶界面分離開,Swing設計者就能夠重用模型的代碼,甚至在程序運行時對觀感進行切換。

          當然,模式只能作為一種指導性的建議而并沒有嚴格的戒律。沒有一種模式能夠適用于所有情況。例如,使用“窗戶位置”模式(設計模式中并非主要成分)來安排小臥室就不太合適。同樣地,Swing設計者發現對于可插觀感實現來說,使用模型-視圖-控制器模式并非都是完美的。

          模型容易分離開,每個用戶界面組件都有一個模型類。但是,視圖和控制器的職責分工有時并不很明顯,這樣將會導致產生很多不同的類。當然,作為這些類的使用者來說,不必為這些細節問題費心。前面已經說過,這些類的使用者根本無需為模型操心—只是使用組件包裝器類。

          Swing按鈕的模型-視圖-控制器分析

          前一章已經介紹了如何使用按鈕,當時沒有考慮模型、視圖和控制器。按鈕是最簡單的用戶界面元素,所以我們從按鈕開始學習模型-視圖-控制器模式。對于更加復雜的Swing組件來說,所遇到的類和接口都是類似的。

          對于大多數組件來說,模型類實現了名字結尾為Model的接口,例如,按鈕就實現了ButtonModel接口。實現了此接口的類可以定義按鈕的多種狀態。實際上,按鈕并不復雜,Swing庫包含了一個名為DefaultButtonModel的類,該類實現了這個接口。

          我們可以通過查看ButtonModel接口中的方法來獲知按鈕模型維護的是哪種類型的數據。表9-1列舉了訪問性方法。

          每個JButton對象存儲一個按鈕模型對象,可以用下列形式得到它的引用。

          JButton button = new JButton("Blue");

          ButtonModel model = button.getModel( );

          實際上,我們不必關心按鈕狀態的瑣碎信息,只有繪制它的視圖才對此感興趣。而像按鈕是否可用這樣的重要信息可以從JButton類中得到。(當然,JButton類也通過向它的模型詢問來獲得這些信息。)

          重新查看ButtonModel接口中不包含的信息。模型不存儲按鈕標簽或者圖標。對于一個按鈕來說,由模型無法知道它的外觀。(在關于單選按鈕組的一節中會看到,這種純粹的設計會為程序員帶來一些麻煩。)

          值得注意的是,同樣的模型(即DefaultButtonModel)可用于下壓按鈕、單選按鈕、復選框,甚至是菜單項。當然,這些按鈕都有各自不同的視圖和控制器。當使用Metal觀感時,JButton類用BasicButtonUI類作為其視圖;用ButtonUIListener類作為控制器。一般來說,每個Swing組件都有一個相關的后綴為UI的視圖對象,但并不是所有的Swing組件都有專門的控制器對象。

          所以,在給出JButton底層工作的簡短介紹之后,你可能會想:JButton究竟是什么?事實上,它僅僅是一個繼承了JComponent的包裝器類,JComponent包含了一個DefaultButtonModel對象,一些視圖數據(例如按鈕標簽和圖標)以及一個負責按鈕視圖的BasicButtonUI對象。

          本文就介紹到這里了,喜歡的朋友可以轉發關注一下??!

          下篇文章介紹布局管理器概述的內容,不容錯過?。。?!


          主站蜘蛛池模板: 国产精品一区二区电影| 成人在线观看一区| 国产精品视频一区二区三区四 | 国产日韩高清一区二区三区| 韩国精品一区视频在线播放| 免费看AV毛片一区二区三区| 精品国产亚洲一区二区三区| 免费萌白酱国产一区二区| 韩国精品一区二区三区无码视频| 久久精品动漫一区二区三区| 蜜臀AV免费一区二区三区| 亚洲色精品VR一区区三区| 国产精品亚洲一区二区麻豆 | 无码av人妻一区二区三区四区| 超清无码一区二区三区| 国产自产在线视频一区| а天堂中文最新一区二区三区| 久久精品一区二区国产| 国产伦精品一区二区三区视频金莲| 色噜噜一区二区三区| 国产在线一区二区| 日本一区二区不卡在线| 久久亚洲国产精品一区二区| 亚洲一区二区三区香蕉| 中文字幕一区在线观看视频| 亚洲免费视频一区二区三区| 一区二区三区无码高清视频| 国产精品免费一区二区三区四区| 中文无码精品一区二区三区| 伊人久久精品一区二区三区| 亚洲熟妇无码一区二区三区| 国产主播在线一区| 欧美一区内射最近更新| 亚洲色无码一区二区三区| 中文字幕无码一区二区免费 | 日本高清无卡码一区二区久久| 一区二区三区免费高清视频| 国产亚洲欧洲Aⅴ综合一区| 无码人妻一区二区三区在线视频| 国产在线一区二区三区av| 国产suv精品一区二区6|