当前位置: 代码迷 >> Eclipse >> swt/jface-托盘有关问题
  详细解决方案

swt/jface-托盘有关问题

热度:629   发布时间:2016-04-23 11:57:40.0
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