首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

swt/jface-托盘有关问题

2012-10-08 
swt/jface-托盘问题小弟 请教各位大侠下,托盘实现像QQ或飞秋样,来信息了,鼠标移到托盘位置,显示消息显示板

swt/jface-托盘问题
小弟 请教各位大侠下,

托盘实现像QQ或飞秋样,来信息了,鼠标移到托盘位置,显示消息显示板,和qq跟飞秋样,

我纠结几天了,swt的托盘无法监听到鼠标的hover之类的事件,监听不到,想了很多法子,至今没有思路解决,

只想到一个流氓点的方法,就是当鼠标移到托盘位置,因为托盘设置了提示文字(settTooltipText),所以鼠标移到托盘位置,提示文

字会自然出现,我就想到,当提示文字出现的时候,我就显示消息面板,(当然前提是在有消息的时候才这么做),我看了很久的源

码,还是没成功,不知道swt自己的类库怎么实现提示文字的出现,望知道的朋友帮个忙,如果有更好的方法,求知不得!!!

希望知道的大哥们帮小弟下啊,天天向上啊

[解决办法]
TrayItem里没有实现监听mouseover事件。要么你自己hack TrayItem类,在里面添加相应代码,然后替换原来的class文件。
另外或许你可以用ToolTip替代简单的tooltiptext。在点击托盘图标时如果有消息,就显示tooltip(通过setVisible(true))
[解决办法]
使用selection+ToolTip widget只是一种可选的方法,为了方便,不需要写一个容器。

重写TrayItem,主要就是重写TrayItem面下面这一段事件处理的代码。这段代码只处理了button以及ballon相关的事件。你可以加上其他类型事件的处理,比如OS.WM_MOUSEHOVER,OS.WM_MOUSEMOVE。这只是给你个思路,有兴趣的话可以尝试一下。

Java code
int /*long*/ messageProc (int /*long*/ hwnd, int msg, int /*long*/ wParam, int /*long*/ lParam) {    /*    * Feature in Windows.  When the user clicks on the tray    * icon, another application may be the foreground window.    * This means that the event loop is not running and can    * cause problems.  For example, if a menu is shown, when    * the user clicks outside of the menu to cancel it, the    * menu is not hidden until an event is processed.  If    * another application is the foreground window, then the    * menu is not hidden.  The fix is to force the tray icon    * message window to the foreground when sending an event.    */    switch ((int)/*64*/lParam) {        case OS.WM_LBUTTONDOWN:            if (hooks (SWT.Selection)) {                OS.SetForegroundWindow (hwnd);                sendSelectionEvent (SWT.Selection);            }            break;        case OS.WM_LBUTTONDBLCLK:        case OS.WM_RBUTTONDBLCLK:            if (hooks (SWT.DefaultSelection)) {                OS.SetForegroundWindow (hwnd);                sendSelectionEvent (SWT.DefaultSelection);            }            break;        case OS.WM_RBUTTONUP: {            if (hooks (SWT.MenuDetect)) {                OS.SetForegroundWindow (hwnd);                sendEvent (SWT.MenuDetect);                // widget could be disposed at this point                if (isDisposed()) return 0;            }            break;        }        case OS.NIN_BALLOONSHOW:            if (toolTip != null && !toolTip.visible) {                toolTip.visible = true;                if (toolTip.hooks (SWT.Show)) {                    OS.SetForegroundWindow (hwnd);                    toolTip.sendEvent (SWT.Show);                    // widget could be disposed at this point                    if (isDisposed()) return 0;                }            }            break;        case OS.NIN_BALLOONHIDE:        case OS.NIN_BALLOONTIMEOUT:        case OS.NIN_BALLOONUSERCLICK:            if (toolTip != null) {                if (toolTip.visible) {                    toolTip.visible = false;                    if (toolTip.hooks (SWT.Hide)) {                        OS.SetForegroundWindow (hwnd);                        toolTip.sendEvent (SWT.Hide);                        // widget could be disposed at this point                        if (isDisposed()) return 0;                    }                }                if (lParam == OS.NIN_BALLOONUSERCLICK) {                    if (toolTip.hooks (SWT.Selection)) {                        OS.SetForegroundWindow (hwnd);                        toolTip.sendSelectionEvent (SWT.Selection);                        // widget could be disposed at this point                        if (isDisposed()) return 0;                    }                }            }            break;    }    display.wakeThread ();    return 0;}
[解决办法]
我想能显示tooltip,就说明托盘能检测到MouseHover类事件,只不过针对此类事件,它执行的仅仅是显示tooltip


[解决办法]

探讨

我想能显示tooltip,就说明托盘能检测到MouseHover类事件,只不过针对此类事件,它执行的仅仅是显示tooltip

[解决办法]
探讨

引用:

我想能显示tooltip,就说明托盘能检测到MouseHover类事件,只不过针对此类事件,它执行的仅仅是显示tooltip

是的,这个事件在底层被处理掉了,没有往上层分发。就像一个exception一下,在底下被catch了,没有throw出来

[解决办法]
探讨

通过几楼的想法,我去实现了下,但是trayItem 我重写了源码后,我不能把它打成jar包,它本来所在jar包包含了很多的扩展包,无法去打成jar包,去继承然后扩展trayItem类,小弟才疏学浅实在没有办法,关于java访问本地jni没有任何的基础,希望大家给予小弟更大的支持,在java ui这一方面,我根本毫无经验,只不过刚出来工作,进的是一个产品公司,产品ui界面实现采用了swt/jfac……

[解决办法]
探讨

通过几楼的想法,我去实现了下,但是trayItem 我重写了源码后,我不能把它打成jar包,它本来所在jar包包含了很多的扩展包,无法去打成jar包,去继承然后扩展trayItem类,小弟才疏学浅实在没有办法,关于java访问本地jni没有任何的基础,希望大家给予小弟更大的支持,在java ui这一方面,我根本毫无经验,只不过刚出来工作,进的是一个产品公司,产品ui界面实现采用了swt/jfac……

[解决办法]
探讨

引用:

TrayItem依赖的接口好多都是非public的,所以继承基本上是不可取的。在原有代码的基础修改TrayItem是可以的,修改好之后,再将编译的class替换原来jar包里的class,自己不要另外打包。

[解决办法]
探讨

回复13楼:
按照您的说法,是不可行的,因为我无法得到本来jar包里的扩展包,所以把类替换进去后,我也无法打成虚拟机认识的jar包,不知是不是方法不对

[解决办法]
探讨

不知有没有更好点的实现方法,问下,有没有用swing搞过托盘,主要效果还是一样,鼠标移到托盘处,可以让程序识别出来

热点排行