2012-10-04 45 views
2

我正在嘗試使用JRuby來顯示帶有SWT的托盤項目。我嘗試過使用Windows 7,Ubuntu Unity/gnome 3 /和gnome classic。JRuby + SWT +系統托盤:我做錯了什麼?

我發現托盤物品沒有出現。此外,菜單正在鼠標光標位置處顯示。

我在這裏做錯了什麼?

=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 [email protected] 
     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 

UPDATE:

我看到這個代碼沒有任何變化適用於在工作中我的Windows 7的M/C。我看到了正確的圖標。我想知道爲什麼它在家裏的窗戶上不起作用。 (當然永遠不會在Ubuntu上)。我使用了相同版本的SWT jar和swt gem。

+0

我要求澄清;當你說:「它沒有工作」,這意味着你得到一個錯誤或程序完成沒有任何錯誤,但該圖標不出現在系統托盤? –

+0

@Franco Rondini程序完成時沒有任何錯誤,但該圖標未出現在系統托盤中。 – rpattabi

+0

做的java等效工作? – rogerdpack

回答

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通過塞巴斯蒂安勒Callonnec

否則,馬丁·薩德勒的文章如下:An Introduction to Desktop Apps with Ruby我發現基於AWT(未SWT)

一些編輯的解決方案:

1)包括Java和進口AWT類,你在你的JRuby類需要

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: Microsoft Windows [Version 6.1.7601]

ruby interpreter: jruby 1.6.7 (ruby-1.9.2-p312) (2012-02-22 3e82bc8) (IBM J9 VM 1.6.0) [Windows Vista-amd64-java]

gem: swt (0.13)

+0

這正是激發我在JRuby中編寫應用程序的文章。但我想用SWT。不是AWT。 – rpattabi

+0

@ ragu.pattabi你是絕對正確的!抱歉。只是編輯了一些提示SWT –

+0

的答案我看到Windows 7 m/c在工作中顯示與原始代碼正確的圖標。當我回到這裏時,我看到了您將TrayItem更改爲org.eclipse.swt.widgets.TrayItem的建議,這與我在Swor :: Widgets中混合到Doro中後是一樣的。我想知道爲什麼它在家裏的窗戶上不起作用。相應地更新了問題。 – rpattabi