Ubuntu JRuby+;SWT&x2B;系统托盘:我做错了什么?
我正在尝试使用JRuby显示带有SWT的托盘项目。我在Windows7、UbuntuUnity/GNOME3/和gnome classic上试过 我发现那个盘子里的东西没上来。此外,菜单将显示在鼠标光标位置 我做错了什么Ubuntu JRuby+;SWT&x2B;系统托盘:我做错了什么?,ubuntu,swt,jruby,system-tray,Ubuntu,Swt,Jruby,System Tray,我正在尝试使用JRuby显示带有SWT的托盘项目。我在Windows7、UbuntuUnity/GNOME3/和gnome classic上试过 我发现那个盘子里的东西没上来。此外,菜单将显示在鼠标光标位置 我做错了什么 =begin # references * usage of swt gem -- https://github.com/danlucraft/swt/blob/master/examples/menu_and_toolbar.rb * SWT tray example --
=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
更新:
我在工作时看到这段代码在我的Windows7M/c上没有任何更改。我正确地看到了图标。我想知道为什么我家的窗户不能用。(当然,ubuntu上从未出现过)。我使用了相同版本的SWT jars和SWT gem。我发现您引用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)
此更改使图标显示在托盘中
要在右键单击图标时显示菜单,请修复设置菜单:
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类的方法,我参考了文章:由Sébastien Le Callonnec撰写
否则,遵循Martin Sadler的文章:我找到了一个基于AWT(而不是SWT)的解决方案
通过一些编辑:
1) 在jruby类中包含您需要的Java和导入awt类
class Doro
include Java
import java.awt.TrayIcon
import java.awt.Toolkit
...
2) 设置菜单并在设置托盘中设置托盘图标
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
测试日期:
操作系统:Microsoft Windows[版本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)
正是这篇文章促使我用JRuby编写我的应用程序。但是我想用SWT。不是AWT.@ragu.pattabi你说得绝对正确!很抱歉刚刚编辑了带有SWTI提示的答案,Windows 7 m/c在工作时用原始代码正确显示了图标。当我回到这里时,我看到了你的建议,将TrayItem改为org.eclipse.swt.widgets.TrayItem,这是一个相同的东西,因为我将swt::widgets混合到了Doro中。我想知道为什么我家的窗户不能用。相应地更新了问题。难道你看不到带有原始代码的托盘图标吗?原始代码失败:NameError:未初始化常量Doro::TrayItem const_在org/jruby/RubyModule.java:2642I要求澄清;当你说:“它不工作”时,意味着你得到了一个错误,或者程序完成时没有任何错误,但图标没有出现在系统托盘中?@Franco Rondini程序完成时没有任何错误,但图标没有出现在系统托盘中。java等效程序工作吗?@rogerdpack没有尝试过。我会检查一下并在这里通知你。谢谢