SWT in NetBeans Ruby IDE

 どうやらNetBeansPreview側ではなく、このへんで更新されているIDEのほうがよいらしいので乗り換え。さくさく動きます。

 前に書いたSWTについては、jruby.batにパスを書いて、デバッグ実行ならうまくいった(通常の実行はうまくいかない)なぜだろう。通常の実行はプロジェクトで指定したパスを見に行くけど、それだとswt**.dllの場所を見つけられないが、デバッグ実行だとjruby/libの下を見に行ってうまくいく……なんてことはないか。よくわかりません。

 で、swtをいろいろ書いてみるが、イベントリスナの登録をどうしたらいいか悩む。結果的に下記のように出来たが、匿名クラスでやるやりかたがわからなかったのでとりあえず普通にクラスを作ってしまった。匿名クラスならローカルスコープで参照できるフォームのコントロールへの参照がとれないので、わざわざアトリビュートを作っていていまいち綺麗ではない。

# main.rb
# 2007/06/13
#
require 'java'


module SWTJava
  include_package 'org.eclipse.swt'
  include_package 'org.eclipse.swt.layout'
  include_package 'org.eclipse.swt.widgets'
  include_package 'org.eclipse.swt.events'
end

 class ClickEvent < SWTJava::SelectionAdapter
    attr_writer :text_label
    def widgetSelected(e)
      shell = e.getSource.getShell
      mesBox = SWTJava::MessageBox.new(shell)
      mesBox.setMessage("#{e.getSource.getText}がクリックされました")
      mesBox.open
      @text_label.setText("#{e.getSource.getText}がクリックされたあと")
    end
 end

 
  SWTJava::Display.setAppName "SWTのテスト"

  display = SWTJava::Display.new
  shell = SWTJava::Shell.new(display)
  shell.setSize(450, 200)

  layout = SWTJava::FillLayout.new(SWTJava::SWT::VERTICAL)


  shell.setLayout layout
  shell.setText "Ruby SWT Test"

  label = SWTJava::Label.new(shell, SWTJava::SWT::CENTER)
  label.setText("テキストラベル")

  button = SWTJava::Button.new(shell, SWTJava::SWT::PUSH)
  button.setText("あいうえおボタン")
  

  al = ClickEvent.new()
  al.text_label = label
  button.addSelectionListener(al)
    
  shell.pack
  shell.open

  while (!shell.isDisposed) do
	  display.sleep unless display.readAndDispatch
  end

  display.dispose