トップ «前の日記(2005-06-03) 最新 次の日記(2005-06-05)» 編集

日々の破片

著作一覧

2005-06-04

_ Rjb

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のスクリプトが動く前提になってしまっている。だったら最初から問題ないわけだし……(もちろん問題ある)


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|

ジェズイットを見習え