Takayuki Okazaki's Weblog
ブログ: 岡崎 - Okazaki's blog
20070613 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

では実行です。
Drawing Sun Curve
はい、実行されました。なお、JRubyのデモンストレーションでは手間を省くために、しばしばJFrameをメインスレッドから起動していますが、Swingのスレッド扱いの流儀からSwingUtilities#invokeLaterを使うのが本筋でしょう。


投稿されたコメント:

★ お名前を空欄にするとIPアドレスが、お名前欄に記入されます。
コメント
コメントは無効になっています。
過去の記事
« 11月 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     
       
今日
Click me to subscribe このブログを購読(RSS)
検索

このブログ著者について
ソフトウエア・インフラストラクチャー・ソリューション本部のソリューション・アーキテクトでした(2008年8月退職)。 本業はSOAソリューションならびにSun Java CAPSによるソリューションのプリセールスをお手伝いするエンジニア、とJavaエバンジェリストグループに参加してセミナーに行ったり、趣味のプログラミング・ネタをこのブログで紹介したりしていました。現在は、ふらふらとwatermint.orgで活動中〜。
リンク
 
SunホットトピックPodcast - SunホットトピックPodcast
 


 

Today's Page Hits: 255