JRuby GUI API三剣客

3170 ワード

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に必要なすべてのテンプレートコードを排除することです.一方、コンポーネントの作成およびアセンブリも、newを使用して新しいSwingウィジェットを作成するなど、通常のJRubyコードとは大きく異なります.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は、Builderアプリケーションを作成するフレームワークであるCheriプロジェクトの一部です.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の構築コードをすべて隠すことができます.
Jean Lazarousによって作成された実験的プロジェクトSwibyは、JavaFXScript(従来のF 3)をJRuby DSLとしてクローン化した.SwibyもBuilderのコンセプトでGUIを構築していますが、JavaFX Scriptからbindオペレータを参考にしています.この方法では、参照された変数が再割り当てされた後に評価される式を定義できます.イベント処理を完了するために洗練された方法を使用します.サンプルコードは次のとおりです.
require 'swiby'

class HelloWorldModel
attr_accessor :saying
end
model = HelloWorldModel.new
model.saying = "Hello World"

Frame {
title "Hello World F3"
 width 200
content {
Label {
text bind(model,:saying)
}
}
visible true
}

これらのAPIはいったいどのAPIがもっと人々の好みに合っているのだろうか.これはまだ観察されている.Swing XML GUI定義クラスライブラリは現在すでにピックアップされており、私たちの視線にはますます多くの新しい類似クラスライブラリが続いています.それらとの違いは,JRubyのクラスライブラリは一般的にブロックが非常に小さく,現在Profligacyの例では200行のコードしかなく,サードパーティクラスライブラリへの依存は存在しないことである.これにより、これらのクラスライブラリの理解とメンテナンスが容易になります.また、これらのクラスライブラリはすべてRubyでGUI定義を記述できるため、拡張も容易です.どのコンポーネントの特性や組合せがサポートされていない場合は、クラスライブラリのメンテナンス者に新しい特性の追加を要求する必要がなく、Swingオブジェクトのみを処理するステップに戻ることもできます.
では、親愛なる読者、ルビーGUIコードを書く方法はどちらが好きですか?
原文:Three approaches to JRuby GUI APIs