JRuby GUI API三劍客

heying1229發表於2007-09-25
JRuby GUI API三劍客[@more@]來自:infoq中文站

 Swing早在1998年被加入JRE 1.2版,因為人們已經發現它的前身AWT在面臨重要的應用已經力不從心了。Swing廣受詬病的問題之一(僅次於效能和外觀問題)就是,哪怕構建一些小型應用都需要帶來大量的編碼工作。因此,又有了一系列基於XML的GUI定義語言應運而生。

  現在,JRuby的橫空出世又引發了一次全新的浪潮,湧現出許多使用(J)Ruby語言特性的類庫,試圖讓Swing應用的開發變得不那麼單調乏味。有了Block,我們就可以從編寫冗餘的Listener樣板程式碼(Boilerplate Code)中解放出來,而Builder的概念則可以用於在Ruby程式碼中建立複雜的巢狀GUI。

  最近剛問世的API叫做Profligacy,發起人是Zed Shaw。這套API的關注點在於讓事件處理變得更加輕而易舉,並免去AWT/Swing Listener所需要的所有樣板程式碼。在另一方面,對元件的建立和裝配也和普通JRuby程式碼的形式大同小異,比如說使用new來建立新的Swing小部件。下面讓我們來看看Profligacy的範例程式碼到底是什麼樣子的:

  @ui = Swing::Build.new JFrame, :texts, :label do |c,i|

  c.texts = [JTextField.new(10), JTextField.new(10)]

  c.texts.each_with_index { |t, n|

  t.action_command = "text#{n}"   }   c.label = JLabel.new "Something will show up here."

  i.texts = {:action => method(:text_action) }

  end

  @ui.layout = FlowLayout.new

  @ui.build("Two Text Fields Demo").default_close_operation = JFrame::EXIT_ON_CLOSE

  def text_action(type, event)

  puts "EVENT: #{type} #{event.action_command}"

  end

  請點選上面的連結檢視更多的示例程式碼。

  由Bill Dortch建立的Cheri::Swing則是Cheri專案的一部分,該專案是一套建立Builder應用的框架。Builder可以讓開發人員使用非常少量的Ruby程式碼建立出層次型的結構。

  menu_bar {

  menu('File') {

  mnemonic :VK_F

  menu_item('Exit') {

  mnemonic :VK_X

  on_click { @frame.dispose }   }   }   }   這段示例程式碼則向我們展示瞭如何使用Ruby的method_missing和Block來使得我們可以使用非常精煉的程式碼,建立出一個選單欄,上面包含了擁有一個選單項的選單。這些方法的呼叫使用的全是Block(包含在花括號內的程式碼)來執行的。同時還把超程式設計(Metaprogramming)和method_missing組合起來,用於判斷到底是該建立一個新的物件,還是在剛剛建立的物件上執行如mnemonic這樣的方法。正如我們看見的 on_click呼叫一樣,Cheri::Swing也可以讓我們輕而易舉地處理事件。on_click也使用了一個Block,它在MenuItem被單擊的時候會被執行,這樣也就把所有冗餘無味的Listener或者Action的構建程式碼隱藏得一乾二淨。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10172717/viewspace-972039/,如需轉載,請註明出處,否則將追究法律責任。

相關文章