Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

The Backyard - RjbMiscProblems Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

解決したものもそうでないものも

!!関連するかも知れない問題
*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