JRuby/Resource のバックアップソース(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- JRuby/Resource へ行く。
- 1 (2012-08-02 (木) 19:23:07)
- 2 (2012-11-16 (金) 18:49:46)
- 3 (2012-11-23 (金) 04:34:09)
- 4 (2013-09-17 (火) 14:31:19)
- 5 (2014-06-05 (木) 02:39:27)
- 6 (2014-09-04 (木) 01:39:55)
- 7 (2014-09-04 (木) 05:24:53)
- 8 (2014-09-26 (金) 19:08:52)
- 9 (2014-11-08 (土) 01:41:12)
- 10 (2015-09-29 (火) 20:04:36)
- 11 (2017-10-27 (金) 16:26:13)
- 12 (2018-02-27 (火) 14:33:04)
- 13 (2019-02-19 (火) 13:57:18)
TITLE:JRubyでリソース(URL)のエントリを取得してSwingで使用する #navi(../) RIGHT:Posted by &author(aterai); at 2012-08-02 * JRubyでリソース(URL)のエントリを取得してSwingで使用する [#paa44789] [http://d.hatena.ne.jp/aterai/20071106 2007-11-06 - てんぷらメモ@はてな]から、こちらに移動 #contents ** 概要 [#b0558335] 以下、JRubyからリソース(URL)のエントリを取得してSwingで使う方法をテストしています。 ** サンプルコード [#da146249] - http://terai.xrea.jp/data/jruby/resources.rb --画像は適当に用意してください。 #code{{ # -*- mode:ruby; Encoding:UTF-8 -*- #module Example include Java import java.awt.BorderLayout class MainPanel < javax.swing.JPanel def initialize super BorderLayout.new ####new javax.swing.ImageIcon("test.png"); #icon = javax.swing.ImageIcon.new "test.png" #icon = javax.swing.ImageIcon.new "./test/test.png" #icon = javax.swing.ImageIcon.new ".\\test\\test.png" #icon = javax.swing.ImageIcon.new "c:/tmp/test.png" #new java.net.URL("http://terai.xrea.jp/data/swing/screenshots.png"); #url = java.net.URL.new "http://terai.xrea.jp/data/swing/screenshots.png" #url = java.net.URL.new "file:/c:/tmp/test.png" #url = java.net.URL.new "file:///c:/tmp/test.png" #url = java.net.URL.new "file://localhost/c:/tmp/test.png" ####this.getClass().getResource("/test.png"); url = self.get_class.get_resource "/test.png" #url = self.get_class.get_resource "/toolbarButtonGraphics/general/Copy24.gif" #url = self.get_class.get_resource "/test.png" ####file:/C:/tmp/org/jruby/javasupport/proxy/gen/test.png #url = self.get_class.get_resource "test.png" ####this.getClass().getClassLoader().getResource("test.png"); #url = self.get_class.class_loader.get_resource "test.png" #url = self.get_class.class_loader.get_resource "toolbarButtonGraphics/general/Copy24.gif" #url = self.get_class.class_loader.get_resource "./Example/test.png" icon = javax.swing.ImageIcon.new url self.add javax.swing.JLabel.new(icon), BorderLayout::CENTER self.preferred_size = java.awt.Dimension.new 320, 240 end end #end #module import javax.swing.UIManager import javax.swing.WindowConstants def createAndShowGUI begin UIManager.look_and_feel = UIManager.system_look_and_feel_class_name rescue Exception => e proxied_e = JavaUtilities.wrap e.cause proxied_e.print_stack_trace end frame = javax.swing.JFrame.new "jruby swing" frame.default_close_operation = WindowConstants::EXIT_ON_CLOSE #frame.content_pane.add Example::MainPanel.new frame.content_pane.add MainPanel.new frame.pack frame.location_relative_to = nil frame.visible = true end class << r = java.lang.Runnable.new def run createAndShowGUI end end java.awt.EventQueue.invokeLater r }} ** URLからImageIconを生成 [#m3e2dbf6] JRubyで、カレントディレクトリにあるリソース(test.png)を使用する場合は、以下のようにファイル名で、SwingのImageIconを生成することができます。 #code{{ #Javaの場合 icon = new javax.swing.ImageIcon("test.png"); icon = javax.swing.ImageIcon.new "test.png" }} ImageIconは、URLから生成することも可能です。 #code{{ url = java.net.URL.new "http://terai.xrea.jp/data/swing/screenshots.png" icon = javax.swing.ImageIcon.new url }} ** 位置に依存しない方法でリソースにアクセスしてImageIconを生成 [#x3d74df5] 次に、ローカルにあるリソースを使う方法を試してみます。 このとき位置に依存しない方法でリソースへアクセスするため、クラスパスをルートとするエントリでURLを生成します。jruby.batでは、クラスパスに環境変数CLASSPATHを使用するようなので、カレントディレクトリにクラスパスを通し、そこにtest.pngを置いて実行します。 >set CLASSPATH=. >jruby resources.rb Class.getResourceメソッドを使う場合、url = this.getClass().getResource("/test.png");と、絶対パス風に頭に/があればクラスパスをルートにするエントリとみなされます。 #code{{ #Javaの場合 url = this.getClass().getResource("/test.png"); url = self.get_class.get_resource "/test.png" icon = javax.swing.ImageIcon.new url #=> file:/C:/tmp/test.png }} JRubyからでも、この方法でリソース(URL)を取得することができました。ただ、self.get_class.get_resourceのgetを省略することはできないようなので、この点だけ注意しておく必要がありそうです。 ** jar(zip)アーカイブ内にあるリソースからImageIconを生成 [#waa13e2c] 同じ方法で、jar(zip)アーカイブ内にあるリソースを取得する方法を確認します。 クラスパスをjar(zip)アーカイブに通せば、その中にあるリソースへのエントリを与えることで、ディレクトリなどにあるリソースと同様にURLを取得することができます。例えば、[http://java.sun.com/developer/techDocs/hi/repository/ Java look and feel Graphics Repository]にある、jlfgr-1_0.jarをダウンロードして、そのまま展開せずにカレントディレクトリに置き、"/toolbarButtonGraphics/general/Copy24.gif"を利用します。 まず、jarにクラスパスを通し、 set CLASSPATH=.;jlfgr-1_0.jar Jarファイルのルートからのエントリ"/toolbarButtonGraphics/general/Copy24.gif"を与えます。 #code{{ url = self.get_class.get_resource "/toolbarButtonGraphics/general/Copy24.gif" #=> jar:file:/C:/tmp/jlfgr-1_0.jar!/toolbarButtonGraphics/general/Copy24.gif }} これも特に問題はなさそうです。 他にも、require でjarファイルをクラスパスに追加する([http://www.oki-osk.jp/esc/ruby/tut-08.html Ruby チュートリアル - 8. JRuby から Java へのアクセス])?方法や #code{{ require "jlfgr-1_0.jar" url = self.get_class.class_loader.get_resource "toolbarButtonGraphics/general/Copy24.gif" }} JAR URL構文を使ってエントリーする方法([http://docs.oracle.com/javase/jp/6/api/java/net/JarURLConnection.html JarURLConnection (Java Platform SE 6)])があるようです。 #code{{ url = java.net.URL.new "jar:file:jlfgr-1_0.jar!/toolbarButtonGraphics/general/Copy24.gif" }} ** 位置に依存しない方法でリソースにアクセスしてImageIconを生成2 [#cbe0e109] 最後に、url = this.getClass().getResource("test.png");と、相対パス風に頭に/が無いエントリを与えた場合の方法を試します。 頭に/が無い場合、クラスファイルと同じディレクトリ階層にリソースをおくと便利になるように、getClass().getResource()メソッドは、"." を "/" に変換された、modified_package_nameが名前("test.png")の前に補完されます。 JRubyでmoduleなしでクラスを作成し、resources.rbと同じ階層のディレクトリにtest.pngを置いて #code{{ url = self.get_class.get_resource "test.png" }} としてもnilになります。Rubyのmoduleを使って別のディレクトリにソースやリソースを移動しても結果は同じです。 どうも、JRubyでJavaのクラスが生成される場合、Rubyのmoduleは考慮せずに、packageは "org.jruby.javasupport.proxy.gen"固定になっている?ようです。このため、このディレクトリを作成して、"/org/jruby/javasupport/proxy/gen/test.png"にリソースをコピーしてから、実行してみると #code{{ p self.get_class.name #=> "org.jruby.javasupport.proxy.gen.JPanel$Proxy0" url = self.get_class.get_resource "test.png" #=> file:/C:/tmp/org/jruby/javasupport/proxy/gen/test.png }} とURLが取得できます。 ** まとめ [#h6359289] 以上、Javaの場合とほとんど同じ方法が使えますが、ローカルにあるシステムリソースを取得したい場合、JRubyでは頭に/が付いたClassPathからのエントリを使うほうが、すっきりうまくいきそうです。 * 参考リンク [#x1f3d4a5] - [http://docs.oracle.com/javase/jp/6/technotes/guides/lang/resources.html 位置に依存しない方法でのリソースへのアクセス] - [http://www.oki-osk.jp/esc/ruby/tut-08.html Ruby チュートリアル - 8. JRuby から Java へのアクセス] * コメント [#z74eaa06] #comment