2

JRuby を使用して、SWT でトレイ アイテムを表示しようとしています。Windows 7、Ubuntu Unity/gnome 3/、および gnome classic でこれを試しました。

トレイ アイテムが表示されないことがわかりました。また、メニューはマウスカーソルの位置に表示されています。

ここで何が間違っていますか?

=begin
# references
* usage of swt gem -- https://github.com/danlucraft/swt/blob/master/examples/menu_and_toolbar.rb
* SWT tray example -- http://git.eclipse.org/c/platform/eclipse.platform.swt.git/tree/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet143.java
=end

require 'java'
require_relative '../dependencies/swt/lib/swt'

class Doro
  include Swt::Widgets

  IMAGE = File.expand_path('../../assets/doro.jpg', __FILE__)

  def initialize
    ui_start
    setup_tray
    ui_end
  end

  def ui_start
    display = Display.get_current
    @shell = Shell.new
    #@shell.text = self.class.to_s
  end

  def ui_end
    #@shell.set_bounds(50, 50, 300, 200)
    #@shell.visible = false
    @shell.pack
    @shell.open
  end

  def setup_tray
    display = @shell.display
    tray = display.get_system_tray
    tray_item = TrayItem.new(tray, Swt::SWT::NONE)
    tray_item.tool_tip_text = 'Doro'
    tray_item.image = Swt::Graphics::Image.new(display, IMAGE)

    tray_item.add_selection_listener { }

=begin
    tray_item.add_show_listener { |event| puts 'show' }
    tray_item.add_listener(Swt::SWT::Show, Swt::SWT::Listener.new { |event| puts 'show' })
    tray_item.add_hide_listener { }
    tray_item.add_default_selection_listener { }
=end

    setup_menu tray_item

    tray_item.visible = true
  end

  def setup_menu(parent)
    menu = Swt::Widgets::Menu.new(@shell, Swt::SWT::POP_UP)

    fileItem = Swt::Widgets::MenuItem.new(menu, Swt::SWT::PUSH)
    fileItem.setText("File")

    editItem = Swt::Widgets::MenuItem.new(menu, Swt::SWT::PUSH)
    editItem.setText("Edit")

    menu.visible = true

    parent.add_menu_detect_listener do
      menu.each { |m| m.visible = true }
    end
  end

  def start
    display = @shell.display

    while !@shell.isDisposed
      display.sleep unless display.read_and_dispatch
    end

    display.dispose
  end
end

app = Doro.new
Swt::Widgets::Display.set_app_name app.class.to_s
app.start

アップデート:

このコードは、作業中の Windows 7 m/c で変更なしで動作することがわかりました。アイコンが正しく表示されます。自宅の窓でなぜ動かなかったのか不思議です。(もちろん、ubuntuでは決してありません)。同じバージョンの SWT jar と swt gem を使用しました。

4

1 に答える 1

1

TrayItem クラスの参照方法に問題があることがわかりました。

def setup_tray
    ...     
    # tray_item = TrayItem.new(tray, Swt::SWT::NONE) # here is the problem, replace with above
    tray_item = org.eclipse.swt.widgets.TrayItem.new(tray, Swt::SWT::NONE)

この変更により、アイコンがトレイに表示されます。

アイコンを右クリックしたときにメニューを表示するには、setup_menu を修正します。

def setup_menu(parent)
    menu = Swt::Widgets::Menu.new(@shell, Swt::SWT::POP_UP)

   fileItem = Swt::Widgets::MenuItem.new(menu, Swt::SWT::PUSH)
   fileItem.setText("File")

   editItem = Swt::Widgets::MenuItem.new(menu, Swt::SWT::PUSH)
   editItem.setText("Edit")

   menu.visible = false # FIXED   
   parent.add_menu_detect_listener do
=begin # fixed debug code     
     items = menu.getItems
     puts "this code block run every time you rightclick the icon in the systray,"
     puts "your menu consists of #{items.count} items"
     items.each { |m| p m.text }
=end      
     # items.each { |m| m.visible = true } #original code
     menu.visible = true # FIXED
   end
end

swt クラスの参照方法については、次の記事を参照してください: using swt with jruby by Sébastien Le Callonnec

それ以外の場合は、Martin Sadler: An Introduction to Desktop Apps with Rubyの記事に従って、AWT (SWT ではない) に基づくソリューションを見つけました。

いくつか編集して:

1) jruby クラスに必要な Java と import awt クラスを含めます

class Doro
  include Java
  import java.awt.TrayIcon
  import java.awt.Toolkit
  ...

2) メニューをセットアップし、setup_tray にトレイ アイコンをセットアップします。

 def setup_tray
    # Setup our menu items
    file_item = java.awt.MenuItem.new("File")
    edit_item = java.awt.MenuItem.new("Edit")
    # Add the items to the popup menu itself
    menu = java.awt.PopupMenu.new
    menu.add(file_item)
    menu.add(edit_item)
    # Give the tray an icon and attach the popup menu to it
    image    = java.awt.Toolkit::default_toolkit.get_image(IMAGE)
    tray_icon = TrayIcon.new(image, "Screenshot!",  menu)
    tray_icon.image_auto_size = true
    # Finally add the tray icon to the tray
    tray = java.awt.SystemTray::system_tray
    tray.add(tray_icon)
  end

テスト済み:

OS:マイクロソフト・ウィンドウズ[バージョン6.1.7601]

ruby インタープリター: jruby 1.6.7 (ruby-1.9.2-p312) (2012-02-22 3e82bc8) (IBM J9 VM 1.6.0) [Windows Vista-amd64-java]

宝石: swt (0.13)

于 2012-10-06T18:37:13.737 に答える