InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

JRuby GUI APIへの3つのアプローチ

作者 Werner Schuster , 翻訳者 佐野 徹郎 投稿日 2007年9月9日

セクション
デベロップメント,
設計/アーキテクチャ
トピック
Domain Specific Languages ,
Java ,
リッチクライアント/デスクトップ ,
Ruby ,
JRuby
タグ
メタプログラミング ,
Swing ,
JRuby ,
GUI

1998年にSwingがJREのバージョン1.2に追加されると、その前身であるAWTは重要なアプリケーションにとって不十分なものとなった。Swingの(パフォーマンスとルックアンドフィールに次ぐ)問題の1つは、小さなアプリケーションを構築するのにも必要なコードの量(が多いこと)だ。この問題によってXMLベースのGUI定義言語(source)が作られることになった。

JRubyの有効性は今、(J)Rubyの言語機能を利用してSwingアプリケーション開発の単調さを軽減するライブラリという、別の動きを始めている。ブロックはイベントリスナーの定型文を避けるのに利用され、ビルダーのコンセプトはRubyコードの中の複雑にネストしたGUIを作成するために利用される。

最新のAPIは(Zed Shaw氏によるProfligacy(サイト・英語)だ。その焦点は、AWTとSwingのイベントリスナーのために必要なすべての定型文を避けて、イベントの取り扱いをより簡単にすることにある。コンポーネントの作成とセットアップは、その一方で、単純な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 projectの一部だ。ビルダーは非常に少ないRubyコードで、階層的な構造の作成を可能にする。

menu_bar { 
menu('File') {
mnemonic :VK_F
menu_item('Exit') {
mnemonic :VK_X
on_click { @frame.dispose }
}
}
}

これはRubyのmethod_missing(メソッドが定義されていないときに呼び出される)とブロックが、いくらかの非常にコンパクトなコードで1つのメニュー項目を含むメニューを持つメニューバーから構成されるコンポーネントツリーの作成を可能にするために、どのように利用されるかを示している。メソッドの呼び出しはすべて、実行されるブロック(中括弧の中のコード)を取る。メタプログラミングとmethod_missingの組み合わせは、新しいオブジェクトを作成するかどうかや、作成されたばかりのオブジェクトのニーモニックのようなメソッドを実行するかどうかの決定に利用される。on_clickの呼び出しに見られるように、Cheri::Swingは簡単なイベントの取り扱いもまた可能にする。on_clickはこのメニュー項目がクリックされたときに実行されるブロックを取り、すべての単調なイベントリスナーやアクションのセットアップを隠蔽する。

Jean Lazarou氏による実験的なSwiby(サイト・英語)は、JRubyのDSLとして(以前はF3として知られていた)JavaFXスクリプトを複製する。それはビルダーのコンセプトを利用してGUIを作成し、さらにJavaFXスクリプトのようにbind演算子を取る。これは変数の1つの参照が再代入されるたびに評価される式の定義を可能にする。これはコンパクトな方法でイベントの取り扱いを処理する。サンプルを以下に記す。

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のどれか1つが何らかの意味を持つようになるかはまだ分からない。XMLでSwingのGUIを定義するライブラリはありふれたもの(source)で、新たに作成されるものは終わりが見えない。それらとの違いはJRubyライブラリが一般にとても小さいことで、Profligacyの場合はサードパーティに依存せず、現在のところコードは200行だ。これは、それらの理解とメンテナンスを容易にする。なので、それらすべてがRubyでGUIの定義を書くことを可能にし、それらはまたとても拡張しやすい。もしいくつかの機能やコンポーネントの組み合わせがサポートされないなら、機能の追加をライブラリのメンテナに働きかけなければならない代わりに、Swingオブジェクトの正しい取り扱いにフォールバックが可能だ。

あなたはどのアプローチでRubyのGUIコードを書くことを好むか?

原文はこちらです:http://www.infoq.com/news/2007/07/jruby-gui-apis

(原文は2007年7月6日にリリースされました)

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。