RjbMiscProblems
解決したものもそうでないものも
関連するかも知れない問題
- rjb-1.0.1で引数に配列を取るメソッドを呼び出すとき、配列引数としてnilを渡すと型変換エラーがでる。
- RubyForgeのリポジトリでは変更されました。_invoke使わなくても引数の数が合っていればOKにしたのと、最初の配列のネスト検証時にチェックを終わらせるようにしました。
- bindがおかしい。bindして実行される際に引数の値をどこかに飛ばしてしまっているようだ。ArgumentErrorが出る。
- rjb-0.1.5で実装しました(実装自体を忘れてました。すみません)
- Component.addActionListner(ActionListener?)したアクションがactionPerformedされると処理がどこかに行ってしまう(かStackOverFlowする?)。しかしスレッドまわりだったら恐ろしいな。Actionは実行されるたびにスレッド作ってるから。そしてApolloのPhi::mainloopみたいなんが欲しいなやっぱり…。
- ぴんぽん(と哀しげな調子で)、スレッドまわりです。しかしこれ使いたいので、なにか方法がないか考えてみます。とは言うもののどうにかなるものなのかなぁ。j2jで通信するとかかな…… mainloopみたいなのはJavaだとどう書くんだろう。
- Interfaceが使いづらいのだが、bindしたあと特異メソッドを定義するだけとかsetHogehoge(Proc)とかに出来ないかな。そういえば、メソッドのオーバーライドはどうすればいいのかな。その場合はsuperの元のメソッドは呼べる?
- それって同じRubyのクラスを共用するという意味? bindしたのの使いまわしはちょっと無理っぽい(bindした時点でJavaから見たインターフェイスのインスタンスになっているから)けど、メソッドの内容は特異メソッドで変えられます。オーバーライドした場合の元のメソッドの呼び出しはsuperで可能です。(スクリプト2を参照)
スクリプト
require 'rjb' frame = Rjb::import('javax.swing.JFrame') border_layout = Rjb::import('java.awt.BorderLayout') button = Rjb::import('javax.swing.JButton') op = Rjb::import('javax.swing.JOptionPane') class Action #set to Proc for action. attr_accessor :action def actionPerformed(event) @action.call end end f = frame.new f.getContentPane().setLayout(border_layout.new) b = button.new("ぼたん") act = Action.new act.action = lambda do op.showMessageDialog(nil, "hello, world!") end act = Rjb::bind(act, "java.awt.event.ActionListener") b.addActionListener(act) f.getContentPane().add(b) f.setSize(200,200) f.setVisible(true) loop do break unless f.isVisible() sleep(0.1) end
スクリプト2(注:マルチスレッド問題があるので動作はしません)
require 'rjb' frame = Rjb::import('javax.swing.JFrame') border_layout = Rjb::import('java.awt.BorderLayout') button = Rjb::import('javax.swing.JButton') op = Rjb::import('javax.swing.JOptionPane') class Action def initialize(op) @op = op end end f = frame.new f.getContentPane().setLayout(border_layout.new) b = button.new("ぼたん") act = Action.new(op) #元のインスタンスを保持しておく b.addActionListener(Rjb::bind(act, "java.awt.event.ActionListener")) #元のインスタンスに特異メソッドを定義(bind後のインスタンスは利用できない) def act.actionPerformed(event) @op.showMessageDialog(nil, "hello, world!") end f.getContentPane().add(b) f.setSize(200,200) f.setVisible(true) loop do break unless f.isVisible() sleep(0.1) end
最初の頃のバグ解決や動作確認に使われたスクリプトなど
(桑島さん提供)
こんなテスト方法がある
jar -tf /usr/java/jre/lib/rt.jar| grep ".*\\.class$" |grep -v "\\$" | tr "/" "." |sed -e 's/\.class$//'
上記のコマンドで作ったクラスの一覧に以下のようなスクリプトを食わせてみましたが今ひとつでした。スクリプトが適当だから…。
require "rjb" Rjb::load ARGF.each_line do |l| unless "".equal?(l) begin Rjb::import(l.chomp) puts "successful:#{l}" rescue => err puts "fault:#{l}" p err Rjb::load end end end
リストはこんなの。
javax.swing.event.TreeExpansionEvent javax.swing.event.TreeModelEvent javax.swing.event.TreeSelectionEvent javax.swing.event.TreeWillExpandListener javax.swing.filechooser.FileSystemView javax.swing.filechooser.GenericFileSystemView javax.swing.filechooser.UnixFileSystemView
Keyword(s):
References:[RubyJavaブリッヂ]