2007年 6月 13日 水曜日 |
日替わり実験室: JRubyとグラフィックス English Translation: (Yahoo!) / (Google) JRubyのデモでは多くの場合、Javaとの親和性をデモンストレーションするためにSwingとの連携が披露されますが、実際にやってみると、JavaでSwingを書くのと同じ記述量が必要なのであまりうまみを感じません・・・。たぶん、フレームの作成とか、パネルの配置とかはJavaでNetBeansなりを使って書いて、スクリプトで書きたい一部分だけをJSR-223を使って呼び出すのが賢いやり方なのでしょう。
しかしながら、それでも負けずにコンソールからJRubyだけを使ってグラフィックスを使ってみることにしました。Swingだけだとおもしろくないので、今回はTimingFrameworkも使っています。 Java標準以外のライブラリをJRuby実行時に指定するには環境変数CLASSPATHにそれを入れておけばよいだけのようです。 $ export CLASSPATH=$CLASSPATH:~/Library/Java/timingframework/TimingFramework-0.54.jarなお、Java SE 6のAPIを一部使っていますので、Java SE 6が使われるようJAVA_HOME環境変数を設定しておきましょう。Macなら次のような感じです (Java SE 6はApple Developer Conenctionからユーザ登録をして事前にインストールしておきます)。 $ export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Homeこんな感じで指定すればよいでしょう。ではいきなりですがコーディングです。
#!/usr/bin/env jruby
require 'java'
include_class 'java.awt.Color'
include_class 'java.awt.Graphics'
include_class 'java.awt.geom.Path2D'
include_class 'javax.swing.JPanel'
include_class 'javax.swing.JFrame'
include_class 'org.jdesktop.animation.timing.TimingTargetAdapter'
include_class 'org.jdesktop.animation.timing.Animator'
def draw_suncurve(g, w, h, c)
s = Path2D::Float.new
s.move_to(0, 0)
s.line_to(w, 0)
s.curve_to(w, 0, w - h / 10, h / 4, w, h / 2)
s.curve_to(w, h / 2, w + h / 10, h * 3 / 4, w, h)
s.line_to(0, h)
s.line_to(0, 0)
g.set_color(c)
g.fill(s)
s
end
class SunCurveAnimator < TimingTargetAdapter
attr_accessor :panel
def begin
g = @panel.get_graphics
g.set_color(Color::WHITE)
g.fill_rect(0, 0, @panel.get_width, @panel.get_height)
end
def timingEvent(f)
draw_suncurve(@panel.get_graphics,
(@panel.get_width - @panel.get_height / 10) * f,
@panel.get_height, Color.new(231, 111, 0))
end
end
class FrameExecutor
include java.lang.Runnable
def run
panel = JPanel.new
frame = JFrame.new('Sun Curve')
frame.set_default_close_operation javax.swing.WindowConstants::EXIT_ON_CLOSE
frame.set_size 800, 600
frame.get_content_pane.add panel
frame.set_visible true
sca = SunCurveAnimator.new
sca.panel = panel
a = Animator.new(2000, sca)
a.set_acceleration(0.2)
a.set_deceleration(0.2)
a.start
end
end
javax.swing.SwingUtilities.invoke_later FrameExecutor.new
では実行です。
はい、実行されました。なお、JRubyのデモンストレーションでは手間を省くために、しばしばJFrameをメインスレッドから起動していますが、Swingのスレッド扱いの流儀からSwingUtilities#invokeLaterを使うのが本筋でしょう。 投稿されたコメント:
★ お名前を空欄にするとIPアドレスが、お名前欄に記入されます。
|
Today's Page Hits: 255 |