著作一覧 |
SwingUtilities.invokeLaterのように、イベントディスパッチスレッドからブロックを与えることによってうまくいくんじゃないかと考えてみた。
つまり、メインスレッドはキューに対する待ち状態とし、キューにはインターフェイスのインスタンスを入れる。スレッド側はインスタンスを入れたところでnotifyを呼び出す。
で、メインスレッドはキューからインターフェイスのインスタンスを取り出し決められたメソッドを呼び出すと、それがブリッジ経由でRubyのスクリプトとして実行される。
このキューの待ち状態に入るメソッドをRjbから呼び出すRjb側のJavaのプログラムとしておけばスレッド側でRubyのスクリプトを呼び出す必要はない。
しかし、よくよく考えてみると、SwingUtilties.invokeLaterへ与えるものは、Rubyのスクリプトにならざるを得ないから、いやでもあっち側でも動くことなる。
ということは結局ダメなんじゃないかな、と気づいた。
SwingUtilities = Rjb::import('javax.swing.SwingUtilities') JFileChooser = Rjb::import('javax.swing.JFileChooser') class Run def initialize(&block) @block = block end def run @block.call end end run = Rjb::bind(Run.new do chooser = JFileChooser.new() ret = chooser.showOpenDialog(nil) if ret == JFileChooser.APPROVE_OPTION puts chooser.getSelectedFile end end, 'java.lang.Runnable') SwingUtilities.invokeAndWait(run)
というか、既にイベントディスパッチスレッドでRubyのスクリプトが動く前提になってしまっている。だったら最初から問題ないわけだし……(もちろん問題ある)
ジェズイットを見習え |