<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
Ruby 目前被作為一種用于構建 Web 應用程序的編程語言而著稱,主要通過 Ruby on Rails 框架使用。但是,這種語言還可以用于開發圖形化桌面應用程序。在本文中,您將學習更多關于使用 Ruby 進行桌面應用程序開發的知識,并完成一個詳細的示例,這個示例使用 Monkeybars — 一個基于 Swing 和 JRuby 的開源庫 — 創建一個 GUI 桌面應用程序。
![]() |
|
標 準的 Ruby 發行版包括用于 Tk 綁定的代碼,Tk 是一組開源的、跨平臺部件集,用于創建圖形化桌面應用程序。這可以帶來很大的方便。但是,在從源代碼安裝 Ruby 時,應確認同時還有 Tk 依賴關系,并確保編譯設置包括 Tk。如果在 Windows? 上使用方便的 “一鍵式(one-click)” 安裝程序包安裝 Ruby,那么仍然需要采取額外步驟使 Tk 工作,因為它不再支持自動安裝。
即使為 Ruby 設置了 Tk,它仍然有點沉悶。在某些目標平臺上,它們看上去相當丑陋。而且,創建復雜的接口令人生畏。Tk 最適合用于較小的 GUI 需求。
可用工具包 Tk 的這些弱點促使了其他面向 Ruby 的 GUI 工具包選項的開發(請參閱 參考資料 查看相關鏈接)。有些值得注意的選擇是:
-
FxRuby
:FxRuby 是用于 Fox 的 Ruby 綁定,這是一個用 C 編寫的 GUI 工具包。它可用于使用 RubyGems 的安裝。對于 Windows,有一個二進制 gem;用于其他平臺的 gem 則需要編譯本地代碼。
-
WxRuby
: WxRuby 是用于跨平臺 wxWidgets C++ GUI 工具包的一個綁定,通過它可以創建擁有本地外觀的桌面應用程序。它可用于使用 gem 的安裝。
-
QtRuby
:QtRuby 提供對 Qt 工具包(在 KDE 桌面系統中使用的工具包)的 Ruby 綁定。對于 Windows 安裝,有一個 gem,但是對于其他平臺則只有源代碼。
-
GTK-Ruby
:GTK 是在 GNOME 中使用的 UI 工具包。要使之運行,需要編譯本地代碼。
-
Shoes
:Shoes 是最近出現的一個與 Ruby GUI 部件有關的工具包。與這份列表中提到的其他工具包不同的是,它是專門為 Ruby 設計的。可以使用特定于平臺的安裝程序來安裝它。
- Swing :Swing?是的,正是這個與每個 Java 運行時環境捆綁的 GUI 庫。如果您運行 JRuby,那么可以使用 Swing。
除了其中一個外,所有這些都是用 C 或 C++ 編寫的 GUI 或部件庫,它們都有相應的綁定,以允許在其他語言,例如 Ruby、Python 和 Perl 中調用它們。在幾乎所有情況下,您都要面對多種考慮,例如安裝和發行。
當然,選擇使用哪個 GUI 工具集取決于您的特定需要。需要考慮以下內容:
- 一套豐富的部件或組件
- 可靠的實現
- 在多種平臺上的可用性(主要是 Macintosh、Win32、KDE 和 GNOME)
- 在托管平臺上的本地感觀
- 是否受到積極的維護
- 易于創建定制的部件
- 未受限的許可
- 可接受的成本
- 可用于加快開發的已有的框架和庫
- 成熟的 IDE 和窗體布局工具
- 測試工具和框架
- 易于打包和部署
如 果只需偶爾拋出消息框,或者請求用戶進行某些簡單的輸入,那么前面列出的所有工具包都適用。對于簡單的需求,只需重點考慮平臺可用性、適合的部件以及適當 的成本。如果打算發布應用程序,那么需要檢查工具包許可。另外,還必須確保用戶已經有所需的環境,或者很容易將所有需要的庫和部件放到一個獨立的應用程序 或一個安裝包中。
但是,對于復雜的應用程序,需求就變得嚴格起來。對于任何超越了簡單窗體的應用程序,幾乎肯定需要有一個窗體設計工具。另外還需要一套豐富的可用部件;不過,可以重用一個已有的數據采集器或文件瀏覽器組件,而不必自己編寫它們。
每 個不同的基于 C 的 Ruby GUI 工具包都有其擅長的一面,但是它們當中沒有明顯的勝者。對于常規的 Ruby 跨平臺桌面開發,并沒有顯而易見的選擇。在不同程度上,它們都有安裝、文檔化、設計工具、打包和部署方面的問題。值得注意的是,逐一對比特性,它們當中沒 有哪個能超過非 C 語言編寫的工具包。
![]() ![]() |
![]()
|
JRuby 是用于 Java 平臺的一個 Ruby 實現(請參閱 參考資料 )。它使您可以通過 JVM 執行 Ruby 代碼。在 JRuby 下運行的 Ruby 代碼還可以裝載和使用 Java 庫,包括 Swing。
![]() |
|
Java 平臺的某些方面使得 JRuby 成為一個好的選擇:
- 它比較穩定,并且經過良好的測試
- 它有較強的社區和供應商支持
- 它有很多良好的文檔
- 有很好的 IDE 和 UI 布局工具可供選擇
- 可免費使用(不管是在成本方面還是許可方面)
- 用戶機器上可能已經安裝了 Java 運行時
如果用(J)Ruby 編寫應用程序,并使用 Swing 實現 UI,則只需確保用戶有最新版本的 Java 運行時,并在打包應用程序時包括 JRuby JAR 文件。由于已經有了用于 JRuby 應用程序打包的 Ruby 工具,所以這些不成問題。
對于從 Ruby 中使用 Swing,有很多選項:
-
原始的、手工編寫的對 Swing 對象的內聯調用
:在最簡單的情況下,可以像引用任何其他 Ruby 對象那樣引用 Swing 對象:
panel = Java::javax::swing::JFrame.new("JRuby panel")
panel.show
-
“Builder” 和領域特定語言(DSL)風格的庫
:全部以手工代碼構造面板和窗體,然后添加組件,這樣可以提高開發速度。有一些庫使 Swing 交互更具 Ruby 風格。例如:
-
Cheri::Swing 使用 Ruby 塊語法生成 Swing 代碼。
- 另一個庫 Profligacy 則圍繞原始的 Swing 調用提供了一個 Ruby 包裝器,它可以幫助您用更少的原始 Java 代碼編寫更多的 Swing 代碼。為了恰當地使用 Swing 組件,仍然需要熟悉 Swing API 文檔。
-
Cheri::Swing 使用 Ruby 塊語法生成 Swing 代碼。
- “我們不關心 Java 類來自何處” 方法 :第三種方法假設用于 Swing 對象的已編譯的 Java 類已經存在,并試圖使用 Ruby 代碼簡化 Swing 對象的創建。
最后是 Monkeybars 庫采用的方法(請參閱 參考資料 )。 現在已經有很多非常好的、免費的圖形化 Swing UI 布局編輯器。和之前提到的 GUI 工具包(例如 Fox 和 GTK)的使用一樣,對于不常見的對話框,不需要 UI 編輯器。但是,除此之外,這類工具是不可替代的,對于一個高級的桌面應用程序,無視這些工具而手工編寫 UI 并無益處。
![]() |
|
Monkeybars 是一個開源 Ruby 庫,它使用一種模型、視圖、控制器(MVC)設計模式將已有的 Java Swing 類(即定義 Swing UI 的已編譯 Java 類)與 Ruby 代碼連接起來。MVC 的目的在于將視圖邏輯和 UI 組件與應用程序邏輯相分離。
由于使用 Java 語言和 Swing 庫,Monkeybars 建立在成熟、健壯的技術之上。與目前用于 JRuby 的其他 Swing 庫不同,它非常適合于構造大型的、復雜的、多面板的應用程序。您將看到,創建 Monkeybars 應用程序需要承擔一定的開銷,所以對于簡單的窗體來說它可能不是最好的選擇。但是,對于有以下需求的 JRuby 桌面應用程序來說,它是一個合理的選擇:
- 可靠的跨平臺部署(確保用戶安裝了最新的 JVM)
- 有大量具有任意復雜度的 UI 部件可供選擇
- 復雜的 UI 窗體和面板構造和交互
![]() |
|
和 Profligacy 一樣,Monkeybars 不隱藏 Swing API。但是,由于它使用編譯過的 UI 類,因此可以充分利用任何工具或應用程序來生成真正的布局。取決于應用程序的復雜性,幾乎不可避免的是,在編寫 Ruby 代碼的過程中,某些時候需要參考 Swing 組件 API 文檔和代碼示例才能知道怎么做(但是由于 JRuby 與 Java 庫的良好集成,很容易將那樣的 Swing 代碼包裝在一個 Ruby API 中,以便于重用)。使用 Monkeybars 構建的程序可能有不同程度的復雜性,但是可以遵循一些基本的模式來使代碼易于維護。
MVC 模式已經有很長的歷史了,并且有很多變體。對于 Monkeybars,基本前提是對于每個 Swing 幀(也就是容納各種組件或 widget 的 UI 對象;在某些情況下,可能是一個模態面板),有 3 個 Ruby 文件:一個模型、一個視圖和一個控制器。模型類存放實際的業務邏輯,并管理與應用程序部分對應的數據。視圖或控制器用于作為與模型進行交互的手段,而模型 并不知道它們的存在。將對視圖和控制器的引用放在模型之外,可以使模型更易于開發和測試。
視圖是另一個 Ruby 文件,它引用一個特定的 Java 類,這個 Java 類包含編譯過的 Swing 代碼。視圖管理 Swing 組件與模型數據的交互。視圖可以直接與模型交互,但是它也使用模型的一個副本,以便將數據傳遞給控制器。在設計模型類時要謹記這一點,因為它最終要為兩個 目的服務。模型的主實例保持長期狀態,并提供應用程序邏輯;而視圖使用的副本實際上是一個可任意使用的數據訪問對象。模型應該易于實例化,并為視圖使用的 任何數據提供基本的訪問方法。
視圖并不直接與控制器交互。相反,有一個信號系統來抽象控制器與視圖之間的交互。這種解耦使得視圖和控制器更易于測試。
![]() |
|
在控制器類中,可以定義 Swing 事件(例如單擊按鈕或更改文本字段)的處理程序,并控制模型的狀態。控制器保留對模型主實例的引用。它并不直接與視圖通信。
當一個控制器需要從視圖獲取數據時,視圖提供模型的一個副本,其中包含當前的 UI 內容。然后,控制器可以決定用該數據更新模型的主實例,或者根據這些值采取某種操作。控制器還可以告訴視圖更新自身,并傳回更新后的值。在示例應用程序中,您將看到這一點。
![]() ![]() |
![]()
|
使用 Monkeybars 的一個示例 JRuby Swing 應用程序
為了讓您感覺一下如何使用 Swing 和 Ruby 創建一個桌面應用程序,我將帶您完成一個簡單的用 Monkeybars 創建的程序(要獲得完整的示例源代碼,請訪問 下載 中的鏈接)。
首先,需要準備好一些東西:
-
獲得一個 jruby-complete.jar(
參考資料
中有下載鏈接)。
-
安裝 Monkeybars 庫。可以作為 gem 安裝它:
sudo gem install monkeybars
也可以從 gitorious.org 上的庫中獲取最新的源代碼(參見 參考資料 )。
-
安裝
rawr
gem:sudo gem install rawr
嚴格地講,rawr
對于編寫 Monkeybars 應用程序不是必需的,但是它提供了很多有用的rake
任務,可以將 JRuby 應用程序轉換成可執行的 JAR 文件。本文的示例將使用它。
示 例應用程序是一個 “flash card” 程序,它讀取一個文本文件,其中定義有很多 “卡片”。它循環運行,直到被關閉,它周期性地短暫顯示和隱藏自己。基本上,它是一個學習工具。對于這個示例,這些卡片是一組德語單詞和短語。該程序還讀 取一個配置文件,該文件定義一個卡片定義文件的位置和一些設置(顯示/隱藏速度,窗口大小)。
這個示例的目標是:
- 展示 Monkeybars 代碼生成器的使用,它可以自動創建普通的文件
- 展示 Monkeybars 應用程序的基本結構
- 演示 Monkeybars MVC 組每個部分的創建
- 展示 Monkeybars 如何處理應用程序數據到 UI 組件的映射
- 展示如何將應用程序打包為可執行的 JAR 文件
安裝后,Monkeybars 提供一個命令行腳本,用于創建一組初始的應用程序文件。要開始一個新的 Monkeybars 項目,可以執行隨 gem 安裝的
monkeybars
腳本。將項目命名為
monkey_see
:
$ monkeybars monkey_see |
這樣會在給定的路徑下(或者,如果只提供應用程序的名稱,則在當前目錄下)創建一個新的目錄,并添加用于新應用程序的核心文件和目錄。
rawr
是源于 Monkeybars 的另一個 Ruby 庫。它處理各種打包任務,并提供一個命令行腳本,用于創建一個基本的 Java 類,Monkeybars 應用程序可以使用這個 Java 類來作為 Java 程序執行(而不是通過 JRuby 使應用程序作為一個 Ruby 程序運行)。
對于這個 Monkeybars 應用程序,為了使用
rawr
,可進入項目目錄,并執行
rawr
腳本:
$ cd money_see; rawr install |
您已經看到了 Monkeybars 如何劃分模型、視圖和控制器。慣例是將這些文件放在相同的目錄中。Monkeybars 提供了一個
rake
任務,用于生成這些文件。您可以創建其中任何一個文件或全部 3 個文件(后者更常見):
$ rake generate ALL=src/flash |
該命令在 src/ 下創建一個名為 flash 的子目錄,其中有 3 個文件:flash_controller.rb、flash_view.rb 和 flash_model.rb。前兩個文件有從基本 Monkeybars 類繼承而來的骨架類。模型代碼則不是這樣;Monkeybars 并不假定您如何管理應用程序邏輯和數據;那完全由您決定。
![]() ![]() |
![]()
|
對 于應用程序的界面,需要一個 Swing 類,以顯示 flash-card 數據。如何創建這個 Swing 類由您決定。Monkeybars 中沒有任何東西使它與任何特定的 UI 工具或 Swing 代碼生成器綁定。按照慣例,Swing 文件與它的相關元組放在同一個目錄中(src/flash/FlashFrame.java)。您需要知道類包,以便將它傳給視圖類(使用
flash
包,并將類命名為
FlashFrame
)。
您的屏幕布局看上去應該如圖 1 所示:
圖 1. 應用程序的屏幕布局

一些關鍵點:應該使用一個
JTextPane
來顯示 flash-card 的內容,以便使用 HTML 來格式化所呈現的文本。另外,對于文本面板和按鈕,還應該使用容易理解的名稱。這樣一來,在處理視圖時,就更容易知道一些關于 UI 組件的信息。這個程序的代碼是用 Ruby 編寫的,所以應使用 Ruby 命名慣例:將文本命名為
pane card_pane
,將兩個菜單項命名為
edit_menu_item
和
quit_menu_item
。另外再為它們提供快捷鍵。
幀本身的名稱并不重要。視圖類可以直接按名稱引用組件。
模 型管理指定 UI 背后的應用程序邏輯和數據。一個 Monkeybars 程序通常對于每個 Java 窗體有一個模型。示例應用程序只有一個模型,用于處理 flash-card 數據。模型代碼需要能夠從一個已知的位置裝載數據,并提供一個公共方法用于提供那些數據。
為簡單起見,將數據存儲在應用程序運行時所在子目錄下的一個文本文件中。這里不要硬編碼 HTML,而是使用 Textile 標記,并使用 RedCloth Ruby 庫來轉換它。每個卡片條目由一個分隔字符串分隔開。
Textile 是一個文本標記格式,用于使用簡單的純文本慣例定義 HTML。例如,為了表示
<em>italicized</em>
,可以編寫
_italicized_
。RedCloth 是一個以 gem 的形式提供的 Ruby 庫,它可以將 Textile 格式的文本轉換成 HTML。
Rubygems 使得安裝和使用第三方的庫變得非常容易,但是,由于您想將代碼打包到一個 JAR 中,并且還可能發布它,所以需要確保與應用程序相關的所有代碼都被打包。為此,解壓 RedCloth gem,并將 redcloth.rb 文件復制到項目的 ruby/lib/ 目錄中:
$ cd /tmp; gem unpack RedCloth |
這將創建 /tmp/RedCloth-3.0.4 /(除非安裝了不同版本的 gem)。將 /tmp/RedCloth-3.0.4/lib/redcloth.rb 復制到
monkey_see
項目的 lib/ruby/ 目錄。
通常,不屬于應用程序核心部分的任何 Ruby 庫都應該放在 lib/ruby/ 中(這是慣例)。如果使用 gem,那么需要解壓實際的庫文件,并將它們添加到項目中。在本文的后面,您將看到怎樣告訴程序如何發現這些文件。
load_cards
方法從磁盤讀取文本文件,劃分出每個卡片,并將結果賦給
@cards
實例變量。
select_card
方法隨機選取一張卡片,并將它賦給
@current_card
實例變量。您將使用
attr_accessor
來定義用于讀取和設置這個變量的方法。
無論 UI 中顯示哪張卡片,都可以在那里編輯它。經過編輯之后,
update_current_card
方法獲取
@current_card
的內容,并重新將它插入到
@cards
數組中。
save
方法將
@cards
數組寫回到磁盤。
current_card
方法的值就是要呈現的值,為了呈現這個值,需要一個視圖類。
Monkeybars 視圖類是 Java Swing 類的所有者。如果打開
flash_view.rb
,可以看到,它調用了一個類方法
set_java_class
。這應該被設置成為這個視圖定義的 Swing 類。在您的代碼中,這是
flash.FlashFrame
。
通常,一個 Monkeybars 視圖類需要做 3 件事:
- 將數據傳入和傳出 Swing 組件
- 管理各種以視圖為中心的行為(例如大小和位置)
- 對控制器發出的信號做出響應
Monkeybars 提供了一個
map
方法,通過該方法可以定義如何將模型方法連接到 Swing 控件。最簡單的用法是連接一個 UI 組件方法和一個模型方法:
map :view => :card_pane.text, :model => :current_card |
該映射使用默認行為,即使之成為一個直接的、雙向的關聯。也就是說,card_pane 組件的
text
方法的結果被傳遞到模型的
current_card=
方法。當根據模型更新視圖時,這個過程又反過來了:
model.current_card
填充
card_pane.text.
(注意:JRuby 處理 Ruby/Java 命名轉換,所以實際的 Swing 方法
setText
可以使用
set_text =
來調用。)
這種簡單的映射常常很好用,但是在某些時候,由于數據類型、格式或某個應用程序邏輯的不同,您不希望直接進行數據交換。Monkeybars 允許在數據交換中使用中介。可以為映射傳遞一個
:using
參數(即指向一個數組的一個 hash 鍵),該參數表明當將數據從模型轉移到視圖和從視圖轉移到模型時所使用的替代方式(使用
:using
的另一個原因是處理這樣的情況,即需要用不符合常規的
getProperty
和
setProperty
模式的組件方法或子對象來操縱 Swing 組件的值或狀態)。
對于您的代碼,需要從模型中獲取一個 Textile 格式的字符串,并在將它賦給
card_pane
text
屬性之前將它轉換成 HTML。為此,您將創建
to_html
方法。另外,您不想直接從視圖中更新模型的
current_card
值。在視圖中,您將有專門的代碼用于編輯卡片,所以在本應使用 view-to-model 之類的方法名的地方,您將使用
nil
。
結果就是這樣的映射:
map :view => :content_pane.text, |
您還希望 Swing 幀以特定的方式顯示。默認情況下,Swing 幀出現在屏幕的左上角。對于您的應用程序,您希望它顯示在屏幕的右上角。您還將給它一個幻燈片效果,使它不至于突然地出現和消失。
視圖類有一個專用的實例變量
@main_view_component
,它引用相應的 Swing 類。視圖代碼通過這個對象與 Swing 組件交互。例如,為了更改 flash-card 文本面板的內容,可以編寫:
@main_view_component.card_pane.text = "Some new text" |
但是,這種代碼實際上正是需要視圖類存在的理由,所以 Monkeybars 讓您不必顯式地使用
@main_view_component
,而是直接引用它的組件:
card_pane.text = "Some new text" |
基本
Monkeybars::View
類使用
method_missing
來攔截那樣的代碼,看它是不是一個組件引用,如果是,則將請求委托給
@main_view_component
。
方法是在 Swing 類上調用的,不過需要顯式的引用:
@main_view_component.width = 500 |
為了取得精美的幻燈片效果,視圖類有一些用于操縱 Swing 幀的高度和位置的方法,以便圖形化地對它進行縮放,使得在每個呈現周期中,它從屏幕的頂端滑下,然后又縮回。
Monkeybars 被設計用來解耦 MVC 元組的關鍵部分。由于視圖有對 Java Swing 對象的直接引用,因此它通常是最難以測試的部分。Monkeybars 的目的是減少視圖與模型和控制器的直接交互。但是,控制器負責處理 UI 事件。不可避免的是,這意味著控制器需要指導視圖做出響應。但是,控制器并不直接與視圖類通信。相反,它使用信號。
稍后您將看到控制器端的情況。在視圖中,您需要使用
define_signal
方法定義信號處理程序。它帶有 2 個參數,一個是信號名稱,另一個是用于處理那個信號的視圖方法:
define_signal :name => :initialize, |
處理程序方法必須帶 2 個參數:一個是模型(從控制器傳入),另一個是傳輸對象。傳輸對象是一個短暫的 hash,用于在控制器與視圖之間來回移動數據。視圖中有為 UI 的初始位置、幻燈片出現、幻燈片消失定義的信號,還有 2 個分別為開始和結束卡片編輯而定義的信號。每種信號的處理程序都很短。下面是
do_roll_up method
:
def do_roll_up model, transfer |
編輯序列是通過菜單事件觸發的。
Edit
菜單項控制編輯。在視圖中,編輯序列意味著設置
card_pane.editable = true
,然后用原始的 Textile 卡片文本換出用 HTML 呈現的內容。另外還需要更改組件的內容類型,以便它正確地呈現純文本。
當編輯完成時,則執行相反的過程。面板呈現 HTML,而
editable
則被設置為
false
。視圖只負責管理 Swing 組件的狀態;控制器則指示模型執行文本更新和保存。
![]() |
|
您 的 Swing 對象有一些菜單項,但是不必將任何用于這些菜單項的代碼放到視圖類中。那些代碼屬于控制器。控制器處理所有 UI 事件,例如單擊按鈕、選擇菜單以及更改文本字段。Monkeybars 為此作了安排,在默認情況下,來自 Swing 代碼的所有事件都被毫無察覺地處理。對于您關心的那些事件,必須定義事件處理程序。在這個示例應用程序中,需要捕捉的事件是單擊菜單。
事件處理程序的形式如下:
def your_component_name_action_performed |
(如果想在代碼中使用實際的 Swing 事件,也可以在定義處理程序時以實際的 Swing 事件作為參數。)
要處理 Quit 菜單項,只需退出:
def quit_menu_item_action_performed |
Edit 菜單動作則復雜一點:
def edit_menu_item_action_performed |
以上代碼通過使用信號驅動視圖來處理編輯模式的開關。要注意的關鍵一點是,卡片文本是如何通過使用控制器的模型實例(通過信號暗中傳遞給視圖)和
view_model
方法提供的視圖的模型副本進行轉移的。
每當控制器需要用戶界面的當前狀態時,它可以使用
view_state
方法來引用視圖的模型副本和當前的傳輸對象。由于從
view_state
獲取模型副本非常常見,所以 Monkeybars 提供了
view_model
方法。
您的控制器還有一個用于實現初始呈現的方法和一個用于顯示/隱藏顯示序列的方法。這兩個方法都使用信號將實際的顯示代碼交給視圖處理。
![]() ![]() |
![]()
|
除了一個或多個 MVC 元組外,Monkeybars 應用程序還使用 2 個關鍵的助手文件來準備和運行代碼。
這 2 個文件都在 src/ 目錄中。manifest.rb 文件設置庫裝載路徑,并允許根據程序是直接從文件系統運行還是從一個 JAR 文件運行來定義包括哪些文件。
之前,您已將
redcloth.rb
添加到 lib/ruby/ 中。為了讓應用程序能找到這個文件,需要將那個目錄添加到裝載路徑中。對于 lib/java/ 目錄也是如此。所以,應確保 manifest.rb 包括以下幾行:
add_to_load_path "../lib/java" |
main.rb 也是在 src/ 中。這是應用程序的 Ruby 入口點。除了其他事情外,它定義一個全局錯誤處理程序,在此將放置在執行主應用程序邏輯之前要運行的特定于平臺的代碼。
示例程序使用一個簡單的循環:
begin |
![]() ![]() |
![]()
|
![]() |
|
有了代碼以及合適的數據文件后,就可以運行程序。使用一個
rawr rake
任務創建一個可執行的 JAR 文件。如果在項目的一開始運行了
rawr install
,那么它會在 src/org/rubyforge/rawr/ 下創建一個 Main.java 文件。從 JAR 運行程序需要一個 Main Java 類;
rawr
可以生成這個文件,它包含查找和解釋 main.rb 文件的基本代碼(或者,如果沒有找到該文件,它將創建一個這樣的文件,并使用該文件)。
rake
rawr:jar
任務編譯該代碼,并將文件打包到一個 JAR 中。build_configuration.yaml 文件用于協調此過程。在創建 JAR 之前,要先編輯這個文件,以反映應用程序的細節。
要啟動程序,首先構建 JAR 文件:
$ rake rawr:jar |
然后調用它:
$ java -jar package/deploy/monkey_see.jar |
應該可以看到 flash-card 屏幕從右上角滾下,停留一會兒,然后又向上滾回。
當窗口可見時,可以使用菜單項編輯當前顯示的卡片。如果要退出,可以使用 Quit 菜單項(如果添加了快捷鍵 Alt+Q 的話,也可以使用該快捷鍵)。
![]() ![]() |
![]()
|
作 為 Ruby 的傳統 C 實現的健壯的、可用的替代品,JRuby 意味著 Ruby GUI 工具包可以超越其他使用 C 實現的工具包,而使用為 Java 平臺提供的 UI 工具。由于 Swing 是 Java 運行時安裝的一個標準部分,Swing 組件為 (J)Ruby 提供了一個成熟的、可立即使用的圖形工具包。使用 Java 平臺意味著應用程序很容易在多個平臺上構建、打包和發布給用戶。通過使用 Monkeybars 庫,Ruby 開發人員可以更輕松地構建易于測試和維護的復雜的桌面應用程序。
本文的示例非常簡單,它主要介紹在 JRuby Swing GUI 開發中可以做什么事情。在 Monkeybars 站點可以找到更多的信息和更復雜的示例(參見 參考資料 )。
![]() ![]() |
![]()
|
描述 名字 大小 下載方法 本文的樣例代碼
j-monkeybars.zip | 25KB | HTTP |
![]() |
||
![]() |
關于下載方法的信息 |
![]() |
學習
-
Monkeybars
:用于 Monkeybars 庫的 API 文檔、教程和示例。
-
JRuby
:訪問 JRuby 站點。
-
“
脫離 Rails 看 Ruby
”(Andrew Glover,developerWorks,2005 年 12 月):這篇文章概述了除 Ruby on Rails 以外,Java 開發人員可以使用 Ruby 做什么事情。
-
訪問
Ruby and Rails 技術資源中心
,這里整理了和 Ruby 動態語言以及十分流行的開源 Web 開發框架 Ruby on Rails 相關的技術文章、教程和相關資源。
-
FxRuby
、
WxRuby
、
QtRuby
、
GTK-Ruby
和
Shoes
:找到更多關于這些面向 Ruby 的 GUI 工具包的信息。
-
Profligacy
和
Cheri::Swing
:這些庫使 Swing 交互更具 Ruby 風格,但是不能處理復雜的 UI。
-
Swing
:查看 Swing 包文檔。
-
瀏覽
技術書店
,找到關于這些技術主題和其他技術專題的書籍。
-
developerWorks Java 技術專區
:這里有數百篇關于 Java 編程方方面面的文章。
獲得產品和技術
-
JRuby
:下載 jruby-complete.jar。
-
Monkeybars
:下載最新的 Monkeybars 源代碼。
![]() |
||
![]() |
James Britt 是 Happy Camper Studios 的負責人,這是位于亞利桑那州菲尼克斯市的一家 Ruby 應用程序開發公司。作為 Ruby 社區的活躍分子,James 曾在美國和歐洲的 Ruby 會議上發表演講,并在 Dr. Dobbs 和 Linux Journal 等出版物上發表了多篇技術文章。他為 Hal Fulton 所著的書籍 The Ruby Way 的第 2 版撰寫了大部分有關 Web 開發的內容。James 還創建和維護了 Ruby-doc.org 網站,這是 Ruby 語言的主要文檔站點。 |
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
