Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

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
Last modified:2011/06/21 23:09:28
Keyword(s):
References:[RubyJavaブリッヂ]